X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0d57be459406c2830f6abc9d99ae99166c6d133b..a5e13868ca700aa39bae26b8fb13c640f466d9f0:/src/motif/bmpbuttn.cpp diff --git a/src/motif/bmpbuttn.cpp b/src/motif/bmpbuttn.cpp index 74a9f6f93e..2be27c9439 100644 --- a/src/motif/bmpbuttn.cpp +++ b/src/motif/bmpbuttn.cpp @@ -42,6 +42,10 @@ bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bit const wxString& name) { m_buttonBitmap = bitmap; + m_buttonBitmapOriginal = bitmap; + m_buttonBitmapSelected = bitmap; + m_buttonBitmapSelectedOriginal = bitmap; + SetName(name); SetValidator(validator); parent->AddChild(this); @@ -86,27 +90,12 @@ bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bit m_mainWidget = (WXWidget) buttonWidget; - if (bitmap.Ok()) - { - Pixmap p1, p2; + m_windowFont = parent->GetFont(); + ChangeFont(FALSE); - p1 = (Pixmap) ((wxBitmap&)bitmap).GetLabelPixmap(m_mainWidget); - p2 = (Pixmap) ((wxBitmap&)bitmap).GetInsensPixmap(m_mainWidget); + ChangeBackgroundColour (); - if(p1 == p2) // <- the Get...Pixmap()-functions return the same pixmap! - { - p2 = - XCreateInsensitivePixmap(DisplayOfScreen(XtScreen(buttonWidget)), p1); - m_insensPixmap = (WXPixmap) p2; - } - - XtVaSetValues (buttonWidget, - XmNlabelPixmap, p1, - XmNlabelInsensitivePixmap, p2, - XmNarmPixmap, (Pixmap) ((wxBitmap&)bitmap).GetArmPixmap (m_mainWidget), - XmNlabelType, XmPIXMAP, - NULL); - } + DoSetBitmap(); XtAddCallback (buttonWidget, XmNactivateCallback, (XtCallbackProc) wxButtonCallback, (XtPointer) this); @@ -114,11 +103,6 @@ bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bit SetCanAddEventHandler(TRUE); AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y); - SetFont(* parent->GetFont()); - - ChangeBackgroundColour (); - - return TRUE; } @@ -132,33 +116,116 @@ wxBitmapButton::~wxBitmapButton() void wxBitmapButton::SetBitmapLabel(const wxBitmap& bitmap) { + m_buttonBitmapOriginal = bitmap; m_buttonBitmap = bitmap; - if (bitmap.Ok()) + DoSetBitmap(); +} + +void wxBitmapButton::SetBitmapSelected(const wxBitmap& sel) +{ + m_buttonBitmapSelected = sel; + m_buttonBitmapSelectedOriginal = sel; + + DoSetBitmap(); +}; + +void wxBitmapButton::SetBitmapFocus(const wxBitmap& focus) +{ + m_buttonBitmapFocus = focus; + // Not used in Motif +}; + +void wxBitmapButton::SetBitmapDisabled(const wxBitmap& disabled) +{ + m_buttonBitmapDisabled = disabled; + m_buttonBitmapDisabledOriginal = disabled; + + DoSetBitmap(); +}; + +void wxBitmapButton::DoSetBitmap() +{ + if (m_buttonBitmapOriginal.Ok()) { - Pixmap labelPixmap, insensPixmap, armPixmap; + Pixmap pixmap = 0; + Pixmap insensPixmap = 0; + Pixmap armPixmap = 0; - labelPixmap = (Pixmap) ((wxBitmap&)bitmap).GetLabelPixmap(m_mainWidget); + // Must re-make the bitmap to have its transparent areas drawn + // in the current widget background colour. + if (m_buttonBitmapOriginal.GetMask()) + { + int backgroundPixel; + XtVaGetValues((Widget) m_mainWidget, XmNbackground, &backgroundPixel, + NULL); + + wxColour col; + col.SetPixel(backgroundPixel); + + wxBitmap newBitmap = wxCreateMaskedBitmap(m_buttonBitmapOriginal, col); + m_buttonBitmap = newBitmap; - if (m_buttonBitmapSelected.Ok()) - armPixmap = (Pixmap) m_buttonBitmapSelected.GetLabelPixmap(m_mainWidget); + pixmap = (Pixmap) m_buttonBitmap.GetPixmap(); + } else - armPixmap = (Pixmap) ((wxBitmap&)bitmap).GetArmPixmap(m_mainWidget); + pixmap = (Pixmap) m_buttonBitmap.GetLabelPixmap(m_mainWidget); - if (m_buttonBitmapDisabled.Ok()) - insensPixmap = (Pixmap) m_buttonBitmapDisabled.GetLabelPixmap(m_mainWidget); + if (m_buttonBitmapDisabledOriginal.Ok()) + { + if (m_buttonBitmapDisabledOriginal.GetMask()) + { + int backgroundPixel; + XtVaGetValues((Widget) m_mainWidget, XmNbackground, &backgroundPixel, + NULL); + + wxColour col; + col.SetPixel(backgroundPixel); + + wxBitmap newBitmap = wxCreateMaskedBitmap(m_buttonBitmapDisabledOriginal, col); + m_buttonBitmapDisabled = newBitmap; + + insensPixmap = (Pixmap) m_buttonBitmapDisabled.GetPixmap(); + } + else + insensPixmap = (Pixmap) m_buttonBitmap.GetInsensPixmap(m_mainWidget); + } else - insensPixmap = (Pixmap) ((wxBitmap&)bitmap).GetInsensPixmap(m_mainWidget); + insensPixmap = (Pixmap) m_buttonBitmap.GetInsensPixmap(m_mainWidget); - if (!insensPixmap || (insensPixmap == labelPixmap)) // <- the Get...Pixmap()-functions return the same pixmap! + // Now make the bitmap representing the armed state + if (m_buttonBitmapSelectedOriginal.Ok()) { - insensPixmap = XCreateInsensitivePixmap(DisplayOfScreen(XtScreen((Widget) m_mainWidget)), labelPixmap); + if (m_buttonBitmapSelectedOriginal.GetMask()) + { + int backgroundPixel; + XtVaGetValues((Widget) m_mainWidget, XmNarmColor, &backgroundPixel, + NULL); + + wxColour col; + col.SetPixel(backgroundPixel); + + wxBitmap newBitmap = wxCreateMaskedBitmap(m_buttonBitmapSelectedOriginal, col); + m_buttonBitmapSelected = newBitmap; + + armPixmap = (Pixmap) m_buttonBitmapSelected.GetPixmap(); + } + else + armPixmap = (Pixmap) m_buttonBitmap.GetArmPixmap(m_mainWidget); + } + else + armPixmap = (Pixmap) m_buttonBitmap.GetArmPixmap(m_mainWidget); + + if (insensPixmap == pixmap) // <- the Get...Pixmap()-functions return the same pixmap! + { + insensPixmap = + XCreateInsensitivePixmap(DisplayOfScreen(XtScreen((Widget) m_mainWidget)), pixmap); m_insensPixmap = (WXPixmap) insensPixmap; } XtVaSetValues ((Widget) m_mainWidget, - XmNlabelPixmap, labelPixmap, - XmNlabelInsensitivePixmap, insensPixmap, + XmNlabelPixmap, pixmap, + XmNlabelInsensitivePixmap, insensPixmap, XmNarmPixmap, armPixmap, XmNlabelType, XmPIXMAP, NULL); @@ -169,27 +236,17 @@ void wxBitmapButton::SetBitmapLabel(const wxBitmap& bitmap) // since it is no longer valid. XtVaSetValues ((Widget) m_mainWidget, XmNlabelType, XmSTRING, - XmNlabelPixmap, NULL, // TODO: Does this work? - XmNlabelInsensitivePixmap, NULL, - XmNarmPixmap, NULL, + XmNlabelPixmap, XmUNSPECIFIED_PIXMAP, + XmNlabelInsensitivePixmap, XmUNSPECIFIED_PIXMAP, + XmNarmPixmap, XmUNSPECIFIED_PIXMAP, NULL); } } -void wxBitmapButton::SetBitmapSelected(const wxBitmap& sel) +void wxBitmapButton::ChangeBackgroundColour() { - m_buttonBitmapSelected = sel; -}; - -void wxBitmapButton::SetBitmapFocus(const wxBitmap& focus) -{ - m_buttonBitmapFocus = focus; - // Not used in Motif -}; - -void wxBitmapButton::SetBitmapDisabled(const wxBitmap& disabled) -{ - m_buttonBitmapDisabled = disabled; -}; - + DoChangeBackgroundColour(m_mainWidget, m_backgroundColour, TRUE); + // Must reset the bitmaps since the colours have changed. + DoSetBitmap(); +}