FIX: Mac semi-translucent colors & suppress dialog flicker during system picker

• Official filament picker now renders semi-transparent colors correctly on macOS.
• Disables the flicker prompt while the default system color picker is open.

jira: STUDIO-13452

Change-Id: I6a83d3cf488114f92813e378b507f293d7c4254e
(cherry picked from commit 4cd2c47f99f956681f41a1af0343efc9ad377684)
This commit is contained in:
fei2.fang
2025-07-24 11:57:50 +08:00
committed by Noisyfox
parent 723ce9d431
commit 91d4b14ba7
3 changed files with 17 additions and 4 deletions

View File

@@ -13,7 +13,11 @@ struct BitmapDC {
wxBitmap bitmap;
wxMemoryDC dc;
BitmapDC(const wxSize& size) : bitmap(size), dc(bitmap) {
BitmapDC(const wxSize& size) : bitmap(size){
#ifdef __WXOSX__
bitmap.UseAlpha();
#endif
dc.SelectObject(bitmap);
// Don't set white background - let the color patterns fill the entire area
dc.SetPen(*wxTRANSPARENT_PEN);
}
@@ -91,6 +95,8 @@ static wxBitmap create_single_filament_bitmap(const wxColour& color, const wxSiz
BitmapDC bdc = init_bitmap_dc(size);
if (!bdc.dc.IsOk()) return wxNullBitmap;
bdc.dc.SetBackground(wxBrush(color));
bdc.dc.Clear();
bdc.dc.SetBrush(wxBrush(color));
bdc.dc.DrawRectangle(0, 0, size.GetWidth(), size.GetHeight());

View File

@@ -625,9 +625,15 @@ void FilamentPickerDialog::BindEvents()
// Bind more colors button event
if (m_more_btn) {
m_more_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) {
// Pause click detection while color picker is open
StopClickDetection();
wxColourData original_data = GetSingleColorData();
wxColourData result = show_sys_picker_dialog(this, original_data);
// Resume click detection after color picker closes
StartClickDetection();
// Check if user actually selected a different color
if (result.GetColour() != original_data.GetColour()) {
wxColour selected_color = result.GetColour();

View File

@@ -683,15 +683,16 @@ wxBitmap *get_extruder_color_icon(std::string color, std::string label, int icon
// there is no neede to scale created solid bitmap
wxColor clr(color);
bitmap = bmp_cache.insert(bitmap_key, wxBitmap(icon_width, icon_height));
#ifndef __WXMSW__
wxMemoryDC dc;
#ifdef __WXOSX__
bitmap->UseAlpha();
wxMemoryDC dc(*bitmap);
#else
wxClientDC cdc((wxWindow *) Slic3r::GUI::wxGetApp().mainframe);
wxMemoryDC dc(&cdc);
dc.SelectObject(*bitmap);
#endif
dc.SetFont(::Label::Body_12);
Slic3r::GUI::WxFontUtils::get_suitable_font_size(icon_height - 2, dc);
dc.SelectObject(*bitmap);
if (clr.Alpha() == 0) {
int size = icon_height * 2;
static wxBitmap transparent = *Slic3r::GUI::BitmapCache().load_svg("transparent", size, size);