diff --git a/src/slic3r/GUI/GUI_Utils.cpp b/src/slic3r/GUI/GUI_Utils.cpp index 697eefea0b..cb8ba45c6b 100644 --- a/src/slic3r/GUI/GUI_Utils.cpp +++ b/src/slic3r/GUI/GUI_Utils.cpp @@ -548,7 +548,7 @@ void RemoveButtonBorder(wxWindow* win) GtkCssProvider* provider = gtk_css_provider_new(); const char* css = - "button {" + "button, button:hover, button:active, button:focus {" " border: none;" " outline: none;" " box-shadow: none;" @@ -589,6 +589,58 @@ void RemoveButtonBorder(wxWindow* win) ); #endif } + +void RemoveInputBorder(wxWindow* win) +{ + GtkWidget* widget = win->GetHandle(); + if (!widget) return; + +#if GTK_CHECK_VERSION(3, 0, 0) + // GTK3+: use CSS provider + GtkCssProvider* provider = gtk_css_provider_new(); + + // Target 'entry' and its inner subnodes (like text selection areas) + const char* css = + "entry, entry text, entry undershoot {" + " border: none;" + " outline: none;" + " box-shadow: none;" + " padding: 0px;" + " margin: 0px;" + " min-height: 0px;" + " min-width: 0px;" + " background: none;" + "}"; + +#if GTK_CHECK_VERSION(4, 0, 0) + // GTK4 + gtk_css_provider_load_from_data(provider, css, -1); +#else + // GTK3 + gtk_css_provider_load_from_data(provider, css, -1, nullptr); +#endif + + GtkStyleContext* ctx = gtk_widget_get_style_context(widget); + gtk_style_context_add_provider( + ctx, + GTK_STYLE_PROVIDER(provider), + GTK_STYLE_PROVIDER_PRIORITY_USER + ); + g_object_unref(provider); + +#else + // GTK2: Target the x/y thickness of the entry widget + gtk_rc_parse_string( + "style \"no-padding-entry\" {" + " xthickness = 0" + " ythickness = 0" + " GtkEntry::inner-border = { 0, 0, 0, 0 }" + " GtkEntry::focus-line-width = 0" + "}" + "class \"GtkEntry\" style \"no-padding-entry\"" + ); +#endif +} #endif // __WXGTK__ #ifdef __linux__ diff --git a/src/slic3r/GUI/GUI_Utils.hpp b/src/slic3r/GUI/GUI_Utils.hpp index 427ba9f0ad..890e8b9e1c 100644 --- a/src/slic3r/GUI/GUI_Utils.hpp +++ b/src/slic3r/GUI/GUI_Utils.hpp @@ -472,8 +472,9 @@ void dataview_remove_insets(wxDataViewCtrl* dv); void staticbox_remove_margin(wxStaticBox* sb); #endif -#ifdef __WXGTK3__ -void RemoveButtonBorder(wxWindow* win); +#ifdef __WXGTK__ +void RemoveButtonBorder(wxWindow* win); // for wxButton/wxBitmapToggleButton based controls (SwitchButton, CheckBox) +void RemoveInputBorder(wxWindow* win); // for TextCtrl based controls (TextInput, ComboBox, SpinInput..) #endif #if defined(__WXOSX__) || defined(__linux__) diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index 8fdca030c6..c979fc3212 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -865,6 +865,9 @@ PlaterPresetComboBox::PlaterPresetComboBox(wxWindow *parent, Preset::Type preset clr_picker = new wxBitmapButton(parent, wxID_ANY, {}, wxDefaultPosition, wxSize(FromDIP(20), FromDIP(20)), wxBU_EXACTFIT | wxBU_AUTODRAW | wxBORDER_NONE); clr_picker->SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE)); clr_picker->SetToolTip(_L("Click to select filament color")); +#ifdef __WXGTK__ + RemoveButtonBorder(clr_picker); +#endif clr_picker->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { // Check if it's an official filament auto fila_type = Preset::remove_suffix_modified(GetValue().ToUTF8().data()); diff --git a/src/slic3r/GUI/Widgets/CheckBox.cpp b/src/slic3r/GUI/Widgets/CheckBox.cpp index 54e98887e7..91cbb8c4e1 100644 --- a/src/slic3r/GUI/Widgets/CheckBox.cpp +++ b/src/slic3r/GUI/Widgets/CheckBox.cpp @@ -2,7 +2,7 @@ #include "../wxExtensions.hpp" -#ifdef __WXGTK3__ +#ifdef __WXGTK__ #include "../GUI_Utils.hpp" #endif @@ -29,7 +29,7 @@ CheckBox::CheckBox(wxWindow *parent, int id) Bind(wxEVT_LEAVE_WINDOW, &CheckBox::updateBitmap, this); #endif -#ifdef __WXGTK3__ +#ifdef __WXGTK__ Slic3r::GUI::RemoveButtonBorder(this); #endif diff --git a/src/slic3r/GUI/Widgets/RadioBox.cpp b/src/slic3r/GUI/Widgets/RadioBox.cpp index a8a1d8a1ef..7f20b8724c 100644 --- a/src/slic3r/GUI/Widgets/RadioBox.cpp +++ b/src/slic3r/GUI/Widgets/RadioBox.cpp @@ -2,6 +2,10 @@ #include "../wxExtensions.hpp" +#ifdef __WXGTK__ +#include "../GUI_Utils.hpp" +#endif + namespace Slic3r { namespace GUI { RadioBox::RadioBox(wxWindow *parent) @@ -15,6 +19,7 @@ RadioBox::RadioBox(wxWindow *parent) // Bind(wxEVT_TOGGLEBUTTON, [this](auto& e) { update(); e.Skip(); }); update(); #ifdef __WXGTK__ + Slic3r::GUI::RemoveButtonBorder(this); wxSize bestSize = GetBestSize(); bestSize.IncTo(m_on.GetBmpSize()); SetSize(bestSize); diff --git a/src/slic3r/GUI/Widgets/SpinInput.cpp b/src/slic3r/GUI/Widgets/SpinInput.cpp index ccd7a80447..fba5a45233 100644 --- a/src/slic3r/GUI/Widgets/SpinInput.cpp +++ b/src/slic3r/GUI/Widgets/SpinInput.cpp @@ -5,6 +5,10 @@ #include +#ifdef __WXGTK__ +#include "../GUI_Utils.hpp" +#endif + BEGIN_EVENT_TABLE(SpinInput, StaticBox) EVT_KEY_DOWN(SpinInput::keyPressed) @@ -58,6 +62,11 @@ void SpinInput::Create(wxWindow *parent, state_handler.attach({&label_color, &text_color}); state_handler.update_binds(); text_ctrl = new TextCtrl(this, wxID_ANY, text, {20, 4}, wxDefaultSize, style | wxBORDER_NONE | wxTE_PROCESS_ENTER, wxTextValidator(wxFILTER_DIGITS)); + +#ifdef __WXGTK__ + Slic3r::GUI::RemoveInputBorder(text_ctrl); +#endif + text_ctrl->SetFont(Label::Body_14); text_ctrl->SetBackgroundColour(background_color.colorForStates(state_handler.states())); text_ctrl->SetForegroundColour(text_color.colorForStates(state_handler.states())); diff --git a/src/slic3r/GUI/Widgets/SwitchButton.cpp b/src/slic3r/GUI/Widgets/SwitchButton.cpp index 9e780c0f02..c391ddd017 100644 --- a/src/slic3r/GUI/Widgets/SwitchButton.cpp +++ b/src/slic3r/GUI/Widgets/SwitchButton.cpp @@ -12,7 +12,7 @@ #include "libslic3r/MacUtils.hpp" #endif -#ifdef __WXGTK3__ +#ifdef __WXGTK__ #include "../GUI_Utils.hpp" #endif @@ -37,7 +37,7 @@ SwitchButton::SwitchButton(wxWindow* parent, wxWindowID id) Bind(wxEVT_TOGGLEBUTTON, [this](auto& e) { update(); e.Skip(); }); SetFont(Label::Body_12); -#ifdef __WXGTK3__ +#ifdef __WXGTK__ Slic3r::GUI::RemoveButtonBorder(this); #endif diff --git a/src/slic3r/GUI/Widgets/TextInput.cpp b/src/slic3r/GUI/Widgets/TextInput.cpp index 362e4c99b3..49605e048d 100644 --- a/src/slic3r/GUI/Widgets/TextInput.cpp +++ b/src/slic3r/GUI/Widgets/TextInput.cpp @@ -6,6 +6,10 @@ #include #include +#ifdef __WXGTK__ +#include "../GUI_Utils.hpp" +#endif + BEGIN_EVENT_TABLE(TextInput, StaticBox) EVT_PAINT(TextInput::paintEvent) @@ -60,6 +64,11 @@ void TextInput::Create(wxWindow * parent, state_handler.attach({&label_color, & text_color}); state_handler.update_binds(); text_ctrl = new TextCtrl(this, wxID_ANY, text, {4, 4}, wxDefaultSize, style | wxBORDER_NONE | wxTE_PROCESS_ENTER); + +#ifdef __WXGTK__ + Slic3r::GUI::RemoveInputBorder(text_ctrl); +#endif + text_ctrl->SetFont(Label::Body_14); text_ctrl->SetInitialSize(text_ctrl->GetBestSize()); text_ctrl->SetBackgroundColour(background_color.colorForStates(state_handler.states())); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index e40046c37d..2ca8f3cfbd 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -1022,6 +1022,10 @@ ScalableButton::ScalableButton( wxWindow * parent, m_width = size.x * 10 / em; m_height= size.y * 10 / em; } + +#ifdef __WXGTK__ + Slic3r::GUI::RemoveButtonBorder(this); +#endif }