diff --git a/src/slic3r/GUI/ExtraRenderers.cpp b/src/slic3r/GUI/ExtraRenderers.cpp index 068a463246..4c16ce8deb 100644 --- a/src/slic3r/GUI/ExtraRenderers.cpp +++ b/src/slic3r/GUI/ExtraRenderers.cpp @@ -235,7 +235,7 @@ bool BitmapTextRenderer::GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value // The icon can't be edited so get its old value and reuse it. wxVariant valueOld; - GetView()->GetModel()->GetValue(valueOld, m_item, /*colName*/0); + GetView()->GetModel()->GetValue(valueOld, m_item, Slic3r::GUI::ColumnNumber::colName); DataViewBitmapText bmpText; bmpText << valueOld; @@ -265,13 +265,10 @@ bool BitmapChoiceRenderer::GetValue(wxVariant& value) const bool BitmapChoiceRenderer::Render(wxRect rect, wxDC* dc, int state) { -// int xoffset = 0; - const wxBitmap& icon = m_value.GetBitmap(); if (icon.IsOk()) { dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon.GetHeight()) / 2); -// xoffset = icon.GetWidth() + 4; if (rect.height == 0) rect.height = icon.GetHeight(); @@ -299,7 +296,6 @@ wxSize BitmapChoiceRenderer::GetSize() const return sz; } - wxWindow* BitmapChoiceRenderer::CreateEditorCtrl(wxWindow* parent, wxRect labelRect, const wxVariant& value) { if (can_create_editor_ctrl && !can_create_editor_ctrl()) @@ -316,7 +312,7 @@ wxWindow* BitmapChoiceRenderer::CreateEditorCtrl(wxWindow* parent, wxRect labelR labelRect.GetTopLeft(), wxSize(labelRect.GetWidth(), -1), 0, nullptr, wxCB_READONLY | CB_NO_DROP_ICON | CB_NO_TEXT); c_editor->GetDropDown().SetUseContentWidth(true); - + if (has_default_extruder && has_default_extruder()) c_editor->Append(_L("default"), *get_default_extruder_color_icon()); @@ -328,18 +324,19 @@ wxWindow* BitmapChoiceRenderer::CreateEditorCtrl(wxWindow* parent, wxRect labelR else c_editor->SetSelection(atoi(data.GetText().c_str()) - 1); -#ifdef __linux__ + // Open the dropdown immediately when the editor is focused. + c_editor->Bind(wxEVT_SET_FOCUS, [c_editor](wxFocusEvent& evt) { + c_editor->ForceDropdownOpen(); + evt.Skip(); + }); + + // Close editor after selection is made c_editor->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent& evt) { - // to avoid event propagation to other sidebar items - evt.StopPropagation(); + evt.StopPropagation(); // FinishEditing grabs new selection and triggers config update. We better call // it explicitly, automatic update on KILL_FOCUS didn't work on Linux. this->FinishEditing(); }); -#else - // to avoid event propagation to other sidebar items - c_editor->Bind(wxEVT_COMBOBOX, [](wxCommandEvent& evt) { evt.StopPropagation(); }); -#endif return c_editor; } diff --git a/src/slic3r/GUI/ExtraRenderers.hpp b/src/slic3r/GUI/ExtraRenderers.hpp index f7be8040b7..18f1f49182 100644 --- a/src/slic3r/GUI/ExtraRenderers.hpp +++ b/src/slic3r/GUI/ExtraRenderers.hpp @@ -132,13 +132,9 @@ private: class BitmapChoiceRenderer : public wxDataViewCustomRenderer { public: - BitmapChoiceRenderer(wxDataViewCellMode mode = -//#ifdef __WXOSX__ -// wxDATAVIEW_CELL_INERT -//#else - wxDATAVIEW_CELL_EDITABLE -//#endif - , int align = wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL + BitmapChoiceRenderer( + wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE, + int align = wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ) : wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align) {} bool SetValue(const wxVariant& value) override; diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index da0326704a..919b7217b1 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -460,6 +460,15 @@ void ObjectList::create_objects_ctrl() AppendBitmapColumn(" ", colEditing, wxOSX ? wxDATAVIEW_CELL_EDITABLE : wxDATAVIEW_CELL_INERT, m_columns_width[colEditing] * em, wxALIGN_CENTER_HORIZONTAL, 0); + + // Open filament editor faster + this->Bind(wxEVT_DATAVIEW_ITEM_ACTIVATED, [this](wxDataViewEvent& event) { + if (event.GetColumn() == colFilament) { + // Trigger the editor opening manually + this->EditItem(event.GetItem(), GetColumn(colFilament)); + } + }); + //for (int cn = colName; cn < colCount; cn++) { // GetColumn(cn)->SetResizeable(cn == colName); //} diff --git a/src/slic3r/GUI/Widgets/ComboBox.cpp b/src/slic3r/GUI/Widgets/ComboBox.cpp index 1e2ad8c042..769ad0442b 100644 --- a/src/slic3r/GUI/Widgets/ComboBox.cpp +++ b/src/slic3r/GUI/Widgets/ComboBox.cpp @@ -241,6 +241,23 @@ void ComboBox::DoDeleteOneItem(unsigned int pos) drop.Invalidate(true); } +void ComboBox::ForceDropdownOpen() +{ + if (!IsEnabled()) + return; + + if (!drop_down) { + drop.need_sync = true; + drop.messureSize(); + drop.autoPosition(); + drop_down = true; + drop.Popup(&drop); + + wxCommandEvent e(wxEVT_COMBOBOX_DROPDOWN); + GetEventHandler()->ProcessEvent(e); + } +} + unsigned int ComboBox::GetCount() const { return items.size(); } void ComboBox::set_replace_text(wxString text, wxString image_name) diff --git a/src/slic3r/GUI/Widgets/ComboBox.hpp b/src/slic3r/GUI/Widgets/ComboBox.hpp index c56dda52a9..5d570e8bf6 100644 --- a/src/slic3r/GUI/Widgets/ComboBox.hpp +++ b/src/slic3r/GUI/Widgets/ComboBox.hpp @@ -76,6 +76,9 @@ public: void SetItemBitmap(unsigned int n, wxBitmap const &bitmap); bool is_drop_down(){return drop_down;} void DeleteOneItem(unsigned int pos) { DoDeleteOneItem(pos); } + + void ForceDropdownOpen(); + protected: virtual int DoInsertItems(const wxArrayStringsAdapter &items, unsigned int pos, diff --git a/src/slic3r/GUI/Widgets/DropDown.cpp b/src/slic3r/GUI/Widgets/DropDown.cpp index 1aee9377e1..2f8c04166e 100644 --- a/src/slic3r/GUI/Widgets/DropDown.cpp +++ b/src/slic3r/GUI/Widgets/DropDown.cpp @@ -525,7 +525,7 @@ void DropDown::messureSize() } if (!align_icon) iconSize.x = 0; wxSize szContent = textSize; - if (szContent.x < FromDIP(120)) + if (szContent.x < FromDIP(120) && !use_content_width) szContent.x = FromDIP(120); szContent.x += 10; if (check_bitmap.bmp().IsOk()) {