OrcaSlicer/src/slic3r/GUI/CapsuleButton.cpp
xun.zhang 19b466ccf0 ENH: add global map mode tag for pop up
1. Add tag to mark the global map mode
2. Fix some wrong usage of bmp in code
3. Fix display error in dark mode

jira:STUDIO-9729

Signed-off-by: xun.zhang <xun.zhang@bambulab.com>
Change-Id: Idb36a5022c403e02c26d7fe23a95dd6877deca90
(cherry picked from commit 5a2abf7e211327cde57717b5ab7b79b63c967bbd)
2025-09-09 15:40:26 +08:00

126 lines
No EOL
4 KiB
C++

#include "GUI_App.hpp"
#include "CapsuleButton.hpp"
#include "wx/graphics.h"
#include "Widgets/Label.hpp"
namespace Slic3r { namespace GUI {
static const wxColour BgNormalColor = wxColour("#FFFFFF");
static const wxColour BgSelectColor = wxColour("#EBF9F0");
static const wxColour TextNormalColor = wxColour("#000000");
static const wxColour TextSelectColor = wxColour("#00AE42");
static const wxColour BorderNormalColor = wxColour("#CECECE");
static const wxColour BorderSelectColor = wxColour("#00AE42");
CapsuleButton::CapsuleButton(wxWindow *parent, wxWindowID id, const wxString &label, bool selected) : wxPanel(parent, id)
{
SetBackgroundColour(*wxWHITE);
SetBackgroundStyle(wxBG_STYLE_PAINT);
m_hovered = false;
m_selected = selected;
auto sizer = new wxBoxSizer(wxHORIZONTAL);
tag_on_bmp = create_scaled_bitmap("capsule_tag_on", nullptr, FromDIP(16));
tag_off_bmp = create_scaled_bitmap("capsule_tag_off", nullptr, FromDIP(16));
m_btn = new wxBitmapButton(this, wxID_ANY, selected?tag_on_bmp:tag_off_bmp, wxDefaultPosition, wxDefaultSize, wxNO_BORDER);
m_btn->SetBackgroundColour(*wxWHITE);
m_label = new Label(this, label);
sizer->AddSpacer(FromDIP(8));
sizer->Add(m_btn, 0, wxALIGN_CENTER | wxTOP | wxBOTTOM, FromDIP(6));
sizer->AddSpacer(FromDIP(8));
sizer->Add(m_label, 0, wxALIGN_CENTER | wxTOP | wxBOTTOM, FromDIP(6));
sizer->AddSpacer(FromDIP(8));
SetSizer(sizer);
Layout();
Fit();
auto forward_click_to_parent = [this](auto &event) {
wxCommandEvent click_event(wxEVT_BUTTON, GetId());
click_event.SetEventObject(this);
this->ProcessEvent(click_event);
};
m_btn->Bind(wxEVT_LEFT_DOWN, forward_click_to_parent);
m_label->Bind(wxEVT_LEFT_DOWN, forward_click_to_parent);
this->Bind(wxEVT_LEFT_DOWN, forward_click_to_parent);
Bind(wxEVT_PAINT, &CapsuleButton::OnPaint, this);
Bind(wxEVT_ENTER_WINDOW, &CapsuleButton::OnEnterWindow, this);
Bind(wxEVT_LEAVE_WINDOW, &CapsuleButton::OnLeaveWindow, this);
GUI::wxGetApp().UpdateDarkUIWin(this);
}
void CapsuleButton::OnPaint(wxPaintEvent &event)
{
wxAutoBufferedPaintDC dc(this);
wxGraphicsContext *gc = wxGraphicsContext::Create(dc);
if (gc) {
dc.Clear();
wxRect rect = GetClientRect();
gc->SetBrush(wxTransparentColour);
gc->DrawRoundedRectangle(0, 0, rect.width, rect.height, 0);
wxColour bg_color = m_selected ? BgSelectColor : BgNormalColor;
wxColour border_color = m_hovered || m_selected ? BorderSelectColor : BorderNormalColor;
bg_color = StateColor::darkModeColorFor(bg_color);
border_color = StateColor::darkModeColorFor(border_color);
gc->SetBrush(wxBrush(bg_color));
gc->SetPen(wxPen(border_color, 1));
gc->DrawRoundedRectangle(1, 1, rect.width - 2, rect.height - 2, 5);
delete gc;
}
}
void CapsuleButton::Select(bool selected)
{
m_selected = selected;
UpdateStatus();
Refresh();
}
void CapsuleButton::OnEnterWindow(wxMouseEvent &event)
{
if (!m_hovered) {
m_hovered = true;
UpdateStatus();
Refresh();
}
event.Skip();
}
void CapsuleButton::OnLeaveWindow(wxMouseEvent &event)
{
if (m_hovered) {
wxPoint pos = this->ScreenToClient(wxGetMousePosition());
if (this->GetClientRect().Contains(pos)) return;
m_hovered = false;
UpdateStatus();
Refresh();
}
event.Skip();
}
void CapsuleButton::UpdateStatus()
{
if (m_selected) {
m_btn->SetBitmap(tag_on_bmp);
m_label->SetForegroundColour(TextSelectColor);
m_label->SetBackgroundColour(BgSelectColor);
m_btn->SetBackgroundColour(BgSelectColor);
} else {
m_btn->SetBitmap(tag_off_bmp);
m_label->SetForegroundColour(TextNormalColor);
m_label->SetBackgroundColour(BgNormalColor);
m_btn->SetBackgroundColour(BgNormalColor);
}
GUI::wxGetApp().UpdateDarkUIWin(this);
}
}} // namespace Slic3r::GUI