From 91d4b14ba757529ca776718721651f42a433dad0 Mon Sep 17 00:00:00 2001 From: "fei2.fang" Date: Thu, 24 Jul 2025 11:57:50 +0800 Subject: [PATCH] FIX: Mac semi-translucent colors & suppress dialog flicker during system picker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • 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) --- src/slic3r/GUI/FilamentBitmapUtils.cpp | 8 +++++++- src/slic3r/GUI/FilamentPickerDialog.cpp | 6 ++++++ src/slic3r/GUI/wxExtensions.cpp | 7 ++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/FilamentBitmapUtils.cpp b/src/slic3r/GUI/FilamentBitmapUtils.cpp index c753bce46c..3308c722cc 100644 --- a/src/slic3r/GUI/FilamentBitmapUtils.cpp +++ b/src/slic3r/GUI/FilamentBitmapUtils.cpp @@ -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()); diff --git a/src/slic3r/GUI/FilamentPickerDialog.cpp b/src/slic3r/GUI/FilamentPickerDialog.cpp index 8dc2090ef7..973f6589fa 100644 --- a/src/slic3r/GUI/FilamentPickerDialog.cpp +++ b/src/slic3r/GUI/FilamentPickerDialog.cpp @@ -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(); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 0226d2f3e3..ce3a92ad29 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -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);