Refine badged static box

This commit is contained in:
Noisyfox 2025-10-05 21:45:49 +08:00
parent a8482a1138
commit 687286ccac
3 changed files with 7 additions and 73 deletions

View file

@ -48,7 +48,6 @@ public:
private:
void PickDC(wxDC& dc);
virtual void DrawBorderAndLabel(wxDC& dc);
protected:
StateHandler state_handler;
@ -64,6 +63,7 @@ protected:
float m_scale;
wxPoint m_pos;
virtual void DrawBorderAndLabel(wxDC& dc);
void GetBordersForSizer(int *borderTop, int *borderOther) const override;
};

View file

@ -1,79 +1,26 @@
#include "StaticGroup.hpp"
StaticGroup::StaticGroup(wxWindow *parent, wxWindowID id, const wxString &label)
: wxStaticBox(parent, id, label)
: LabeledStaticBox(parent, label)
{
SetBackgroundColour(*wxWHITE);
SetForegroundColour("#CECECE");
borderColor_ = wxColour("#CECECE");
#ifdef __WXMSW__
Bind(wxEVT_PAINT, &StaticGroup::OnPaint, this);
#endif
}
void StaticGroup_layoutBadge(void * group, void * badge);
void StaticGroup::ShowBadge(bool show)
{
#ifdef __WXMSW__
if (show)
badge = ScalableBitmap(this, "badge", 18);
else
badge = ScalableBitmap{};
Refresh();
#endif
#ifdef __WXOSX__
if (show && badge == nullptr) {
badge = new ScalableButton(this, wxID_ANY, "badge", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, false, 18);
badge->SetSize(badge->GetBestSize());
badge->SetBackgroundColour("#F7F7F7");
StaticGroup_layoutBadge(GetHandle(), badge->GetHandle());
}
if (badge && badge->IsShown() != show)
badge->Show(show);
#endif
}
void StaticGroup::SetBorderColor(const wxColour &color)
void StaticGroup::DrawBorderAndLabel(wxDC& dc)
{
borderColor_ = color;
}
#ifdef __WXMSW__
void StaticGroup::OnPaint(wxPaintEvent &evt)
{
wxStaticBox::OnPaint(evt);
LabeledStaticBox::DrawBorderAndLabel(dc);
if (badge.bmp().IsOk()) {
auto s = badge.bmp().GetScaledSize();
wxPaintDC dc(this);
dc.DrawBitmap(badge.bmp(), GetSize().x - s.x, 8);
}
}
void StaticGroup::PaintForeground(wxDC &dc, const struct tagRECT &rc)
{
wxStaticBox::PaintForeground(dc, rc);
auto mdc = dynamic_cast<wxMemoryDC *>(&dc);
auto image = mdc->GetSelectedBitmap().ConvertToImage();
// Found border coords
int top = 0;
int left = 0;
int right = rc.right - 1;
int bottom = rc.bottom - 1;
auto blue = GetBackgroundColour().Blue();
while (image.GetBlue(0, top) == blue && top < bottom) ++top;
while (image.GetBlue(left, top) != blue && left < right) ++left; // --left; // fix start
while (image.GetBlue(right, top) != blue && right > 0) --right;
++right;
while (image.GetBlue(0, bottom) == blue && bottom > 0) --bottom;
// Draw border with foreground color
wxPoint polygon[] = { {left, top}, {0, top}, {0, bottom}, {rc.right - 1, bottom}, {rc.right - 1, top}, {right, top} };
dc.SetPen(wxPen(borderColor_, 1));
for (int i = 1; i < 6; ++i) {
if (i == 4) // fix bottom right corner
++polygon[i - 1].y;
dc.DrawLine(polygon[i - 1], polygon[i]);
}
}
#endif

View file

@ -3,30 +3,17 @@
#include "../wxExtensions.hpp"
#include <wx/statbox.h>
#include "LabeledStaticBox.hpp"
class StaticGroup : public wxStaticBox
class StaticGroup : public LabeledStaticBox
{
public:
StaticGroup(wxWindow *parent, wxWindowID id, const wxString &label);
public:
void ShowBadge(bool show);
void SetBorderColor(const wxColour &color);
private:
#ifdef __WXMSW__
void OnPaint(wxPaintEvent &evt);
void PaintForeground(wxDC &dc, const struct tagRECT &rc) override;
#endif
private:
#ifdef __WXMSW__
void DrawBorderAndLabel(wxDC& dc) override;
ScalableBitmap badge;
#endif
#ifdef __WXOSX__
ScalableButton * badge { nullptr };
#endif
wxColour borderColor_;
};
#endif // !slic3r_GUI_StaticGroup_hpp_