summaryrefslogtreecommitdiff
path: root/wx+/bitmap_button.h
diff options
context:
space:
mode:
Diffstat (limited to 'wx+/bitmap_button.h')
-rw-r--r--wx+/bitmap_button.h86
1 files changed, 68 insertions, 18 deletions
diff --git a/wx+/bitmap_button.h b/wx+/bitmap_button.h
index b40d8dd3..508a72fc 100644
--- a/wx+/bitmap_button.h
+++ b/wx+/bitmap_button.h
@@ -8,6 +8,7 @@
#define BITMAP_BUTTON_H_83415718945878341563415
#include <wx/bmpbuttn.h>
+#include <wx/settings.h>
#include "image_tools.h"
#include "dc.h"
@@ -26,17 +27,20 @@ public:
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxButtonNameStr) :
- wxBitmapButton(parent, id, wxNullBitmap, pos, size, style | wxBU_AUTODRAW, validator, name) { SetLabel(label); }
+ wxBitmapButton(parent, id, wxNullBitmap, pos, size, style, validator, name)
+ {
+ SetLabel(label);
+ }
};
//wxButton::SetBitmap() also supports "image + text", but screws up proper gap and border handling
void setBitmapTextLabel(wxBitmapButton& btn, const wxImage& img, const wxString& text, int gap = fastFromDIP(5), int border = fastFromDIP(5));
//set bitmap label flicker free:
-void setImage(wxBitmapButton& button, const wxBitmap& bmp);
-
-
+void setImage(wxBitmapButton& button, const wxImage& bmp);
+wxBitmap renderSelectedButton(const wxSize& sz);
+wxBitmap renderPressedButton(const wxSize& sz);
@@ -53,34 +57,80 @@ void setBitmapTextLabel(wxBitmapButton& btn, const wxImage& img, const wxString&
gap = std::max(0, gap);
border = std::max(0, border);
- wxImage dynImage = createImageFromText(text, btn.GetFont(), btn.GetForegroundColour());
+ wxImage imgTxt = createImageFromText(text, btn.GetFont(), btn.GetForegroundColour());
if (img.IsOk())
- dynImage = btn.GetLayoutDirection() != wxLayout_RightToLeft ?
- stackImages(img, dynImage, ImageStackLayout::horizontal, ImageStackAlignment::center, gap) :
- stackImages(dynImage, img, ImageStackLayout::horizontal, ImageStackAlignment::center, gap);
+ imgTxt = btn.GetLayoutDirection() != wxLayout_RightToLeft ?
+ stackImages(img, imgTxt, ImageStackLayout::horizontal, ImageStackAlignment::center, gap) :
+ stackImages(imgTxt, img, ImageStackLayout::horizontal, ImageStackAlignment::center, gap);
//SetMinSize() instead of SetSize() is needed here for wxWindows layout determination to work correctly
const int defaultHeight = wxButton::GetDefaultSize().GetHeight();
- btn.SetMinSize({dynImage.GetWidth () + 2 * border,
- std::max(dynImage.GetHeight() + 2 * border, defaultHeight)});
+ btn.SetMinSize({imgTxt.GetWidth () + 2 * border,
+ std::max(imgTxt.GetHeight() + 2 * border, defaultHeight)});
- btn.SetBitmapLabel(wxBitmap(dynImage));
+ btn.SetBitmapLabel(imgTxt);
//SetLabel() calls confuse wxBitmapButton in the disabled state and it won't show the image! workaround:
- btn.SetBitmapDisabled(wxBitmap(dynImage.ConvertToDisabled()));
+ btn.SetBitmapDisabled(imgTxt.ConvertToDisabled());
}
inline
-void setImage(wxBitmapButton& button, const wxBitmap& bmp)
+void setImage(wxBitmapButton& button, const wxImage& img)
{
- if (!button.GetBitmapLabel().IsSameAs(bmp))
+ if (!img.IsOk())
{
- button.SetBitmapLabel(bmp);
+ button.SetBitmapLabel (wxNullBitmap);
+ button.SetBitmapDisabled(wxNullBitmap);
+ return;
+ }
- //wxWidgets excels at screwing up consistently once again:
- //the first call to SetBitmapLabel() *implicitly* sets the disabled bitmap, too, subsequent calls, DON'T!
- button.SetBitmapDisabled(bmp.ConvertToDisabled()); //inefficiency: wxBitmap::ConvertToDisabled() implicitly converts to wxImage!
+ button.SetBitmapLabel(img);
+
+ //wxWidgets excels at screwing up consistently once again:
+ //the first call to SetBitmapLabel() *implicitly* sets the disabled bitmap, too, subsequent calls, DON'T!
+ button.SetBitmapDisabled(img.ConvertToDisabled()); //inefficiency: wxBitmap::ConvertToDisabled() implicitly converts to wxImage!
+}
+
+
+inline
+wxBitmap renderSelectedButton(const wxSize& sz)
+{
+ wxBitmap bmp(sz); //seems we don't need to pass 24-bit depth here even for high-contrast color schemes
+ {
+ wxMemoryDC dc(bmp);
+ dc.SetBrush(wxColor(0xcc, 0xe4, 0xf8)); //light blue
+ dc.SetPen (wxColor(0x79, 0xbc, 0xed)); //medium blue
+ dc.DrawRectangle(wxRect(bmp.GetSize()));
+ }
+ return bmp;
+}
+
+
+inline
+wxBitmap renderPressedButton(const wxSize& sz)
+{
+ wxBitmap bmp(sz); //seems we don't need to pass 24-bit depth here even for high-contrast color schemes
+ {
+ //draw rectangle border with gradient
+ const wxColor colFrom = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
+ const wxColor colTo(0x11, 0x79, 0xfe); //light blue
+
+ wxMemoryDC dc(bmp);
+ dc.SetBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+ wxRect rect(bmp.GetSize());
+
+ const int borderSize = fastFromDIP(3);
+ for (int i = 1 ; i <= borderSize; ++i)
+ {
+ const wxColor colGradient((colFrom.Red () * (borderSize - i) + colTo.Red () * i) / borderSize,
+ (colFrom.Green() * (borderSize - i) + colTo.Green() * i) / borderSize,
+ (colFrom.Blue () * (borderSize - i) + colTo.Blue () * i) / borderSize);
+ dc.SetPen(colGradient);
+ dc.DrawRectangle(rect);
+ rect.Deflate(1);
+ }
}
+ return bmp;
}
}
bgstack15