OrcaSlicer/src/slic3r/GUI/Widgets/LabeledStaticBox.cpp
yw4z b410154cb3
Some checks are pending
Build all / Build All (push) Waiting to run
Build all / Flatpak (push) Waiting to run
Improvements / Fixes for RadioGroup and apply to more windows II (#10089)
* init

* Fix issue that `Button` is not focusable on Linux

See: https://github.com/SoftFever/OrcaSlicer/pull/10089#issuecomment-3065050902

---------

Co-authored-by: Noisyfox <timemanager.rick@gmail.com>
2025-07-12 19:26:47 +08:00

181 lines
No EOL
5 KiB
C++

#include "LabeledStaticBox.hpp"
#include "libslic3r/Utils.hpp"
#include "../GUI.hpp"
#include "../GUI_Utils.hpp"
#include "Label.hpp"
LabeledStaticBox::LabeledStaticBox()
: state_handler(this)
{
m_radius = 3;
m_border_width = 1;
m_font = Label::Head_14;
text_color = StateColor(
std::make_pair(0x363636, (int) StateColor::Normal),
std::make_pair(0x6B6B6B, (int) StateColor::Disabled)
);
background_color = StateColor(
std::make_pair(0xFFFFFF, (int) StateColor::Normal),
std::make_pair(0xF0F0F1, (int) StateColor::Disabled)
);
border_color = StateColor(
std::make_pair(0xDBDBDB, (int) StateColor::Normal),
std::make_pair(0xDBDBDB, (int) StateColor::Disabled)
);
}
LabeledStaticBox::LabeledStaticBox(
wxWindow* parent,
const wxString& label,
const wxPoint& pos,
const wxSize& size,
long style
)
: LabeledStaticBox()
{
Create(parent, label, pos, size, style);
}
bool LabeledStaticBox::Create(
wxWindow* parent,
const wxString& label,
const wxPoint& pos,
const wxSize& size,
long style
)
{
if (style & wxBORDER_NONE)
m_border_width = 0;
wxStaticBox::Create(parent, wxID_ANY, label, pos, size, style);
#ifdef __WXOSX__
Slic3r::GUI::staticbox_remove_margin(this);
#endif
m_label = label;
m_scale = FromDIP(100) / 100.f;
m_pos = this->GetPosition();
int tW,tH,descent,externalLeading;
// empty label sets m_label_height as 0 that causes extra spacing at top
GetTextExtent(m_label.IsEmpty() ? "Orca" : m_label, &tW, &tH, &descent, &externalLeading, &m_font);
m_label_height = tH - externalLeading;
m_label_width = tW;
Bind(wxEVT_PAINT,([this](wxPaintEvent e) {
wxPaintDC dc(this);
PickDC(dc);
}));
state_handler.attach({&text_color, &background_color, &border_color});
state_handler.update_binds();
#ifndef __WXOSX__
SetBackgroundStyle(wxBG_STYLE_PAINT);
#endif
SetBackgroundColour(background_color.colorForStates(state_handler.states()));
SetForegroundColour( text_color.colorForStates(state_handler.states()));
SetBorderColor( border_color.colorForStates(state_handler.states()));
SetCanFocus(false);
DisableFocusFromKeyboard();
return true;
}
void LabeledStaticBox::SetCornerRadius(int radius)
{
this->m_radius = radius;
Refresh();
}
void LabeledStaticBox::SetBorderWidth(int width)
{
this->m_border_width = width;
Refresh();
}
void LabeledStaticBox::SetBorderColor(StateColor const &color)
{
border_color = color;
state_handler.update_binds();
Refresh();
}
void LabeledStaticBox::SetFont(wxFont set_font)
{
m_font = set_font;
Refresh();
}
bool LabeledStaticBox::Enable(bool enable)
{
bool result = this->wxStaticBox::Enable(enable);
if (result) {
wxCommandEvent e(EVT_ENABLE_CHANGED);
e.SetEventObject(this);
GetEventHandler()->ProcessEvent(e);
this->SetForegroundColour( text_color.colorForStates(state_handler.states()));
this->SetBorderColor( border_color.colorForStates(state_handler.states()));
}
return result;
}
void LabeledStaticBox::PickDC(wxDC& dc)
{
#ifdef __WXMSW__
wxSize size = GetSize();
if (size.x <= 0 || size.y <= 0)
return;
wxMemoryDC memdc(&dc);
if (!memdc.IsOk()) {
DrawBorderAndLabel(dc);
return;
}
wxBitmap bmp(size.x, size.y);
memdc.SelectObject(bmp);
memdc.SetBackground(wxBrush(GetBackgroundColour()));
memdc.Clear();
{
wxGCDC dc2(memdc);
DrawBorderAndLabel(dc2);
}
memdc.SelectObject(wxNullBitmap);
dc.DrawBitmap(bmp, 0, 0);
#else
DrawBorderAndLabel(dc);
#endif
}
void LabeledStaticBox::DrawBorderAndLabel(wxDC& dc)
{
// fill full background
dc.SetBackground(wxBrush(background_color.colorForStates(0)));
dc.Clear();
wxSize wSz = GetSize();
dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.SetPen(wxPen(border_color.colorForStates(state_handler.states()), m_border_width, wxSOLID));
dc.DrawRoundedRectangle( // Border
std::max(0, m_pos.x),
std::max(0, m_pos.y) + m_label_height * .5,
wSz.GetWidth(),
wSz.GetHeight() - m_label_height * .5,
m_radius * m_scale
);
if (!m_label.IsEmpty()) {
dc.SetFont(m_font);
dc.SetPen(*wxTRANSPARENT_PEN);
dc.SetBrush(wxBrush(background_color.colorForStates(0)));
dc.DrawRectangle(wxRect(7 * m_scale,0 , m_label_width + 7 * m_scale, m_label_height)); // text background
// NEEDFIX if text lenght > client size
dc.SetTextForeground(text_color.colorForStates(state_handler.states()));
dc.DrawText(m_label, wxPoint(10 * m_scale, 0));
}
}
void LabeledStaticBox::GetBordersForSizer(int* borderTop, int* borderOther) const {
wxStaticBox::GetBordersForSizer(borderTop, borderOther);
#ifdef __WXOSX__
*borderOther = 5; // Make sure macOS uses the same border padding as other platforms
#endif
}