diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 6bbe209f32..0c129803a5 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2858,7 +2858,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) int keyCode = evt.GetKeyCode(); int ctrlMask = wxMOD_CONTROL; int shiftMask = wxMOD_SHIFT; - if (keyCode == WXK_ESCAPE && (_deactivate_undo_redo_toolbar_items() || _deactivate_search_toolbar_item() || _deactivate_arrange_menu())) + if (keyCode == WXK_ESCAPE && (_deactivate_undo_redo_toolbar_items() || _deactivate_arrange_menu())) return; if (m_gizmos.on_char(evt)) { @@ -2890,14 +2890,6 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) #endif /* __APPLE__ */ post_event(SimpleEvent(EVT_GLTOOLBAR_COPY)); break; -#ifdef __APPLE__ - case 'f': - case 'F': -#else /* __APPLE__ */ - case WXK_CONTROL_F: -#endif /* __APPLE__ */ - _activate_search_toolbar_item(); - break; #ifdef __APPLE__ case 'm': case 'M': @@ -3354,10 +3346,9 @@ void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt) } } - // If the Search window or Undo/Redo list is opened, + // If Undo/Redo list is opened, // update them according to the event - if (m_main_toolbar.is_item_pressed("search") || - m_undoredo_toolbar.is_item_pressed("undo") || + if (m_undoredo_toolbar.is_item_pressed("undo") || m_undoredo_toolbar.is_item_pressed("redo")) { m_mouse_wheel = int((double)evt.GetWheelRotation() / (double)evt.GetWheelDelta()); return; @@ -3664,7 +3655,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } else if (evt.LeftDown() || evt.RightDown() || evt.MiddleDown()) { - if (_deactivate_undo_redo_toolbar_items() || _deactivate_search_toolbar_item() || _deactivate_arrange_menu()) + if (_deactivate_undo_redo_toolbar_items() || _deactivate_arrange_menu()) return; // If user pressed left or right button we first check whether this happened @@ -4765,73 +4756,6 @@ bool GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) return action_taken; } -// Getter for the const char*[] for the search list -static bool search_string_getter(int idx, const char** label, const char** tooltip) -{ - const Search::OptionsSearcher& search_list = wxGetApp().searcher(); - if (0 <= idx && (size_t)idx < search_list.size()) { - search_list[idx].get_marked_label_and_tooltip(label, tooltip); - return true; - } - return false; -} - -bool GLCanvas3D::_render_search_list(float pos_x) -{ - bool action_taken = false; - ImGuiWrapper* imgui = wxGetApp().imgui(); - - imgui->set_next_window_pos(pos_x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); - std::string title = L("Search"); - imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - - int selected = -1; - bool edited = false; - float em = static_cast(wxGetApp().em_unit()); -#if ENABLE_RETINA_GL - em *= m_retina_helper->get_scale_factor(); -#endif // ENABLE_RETINA_GL - - // update searcher before show imGui search dialog on the plater, if printer technology or mode was changed - wxGetApp().check_and_update_searcher(wxGetApp().get_mode()); - Search::OptionsSearcher& searcher = wxGetApp().searcher(); - - std::string& search_line = searcher.search_string(); - char *s = new char[255]; - strcpy(s, search_line.empty() ? _u8L("Enter a search term").c_str() : search_line.c_str()); - - imgui->search_list(ImVec2(45 * em, 30 * em), &search_string_getter, s, - wxGetApp().searcher().view_params, - selected, edited, m_mouse_wheel, wxGetApp().is_localized()); - - search_line = s; - delete [] s; - if (search_line == _u8L("Enter a search term")) - search_line.clear(); - - if (edited) - searcher.search(); - - if (selected >= 0) { - // selected == 9999 means that Esc kye was pressed - /*// revert commit https://github.com/prusa3d/PrusaSlicer/commit/91897589928789b261ca0dc735ffd46f2b0b99f2 - if (selected == 9999) - action_taken = true; - else - sidebar.jump_to_option(selected);*/ - if (selected != 9999) { - imgui->end(); // end imgui before the jump to option - wxGetApp().jump_to_option(selected); - return true; - } - action_taken = true; - } - - imgui->end(); - - return action_taken; -} - bool GLCanvas3D::_render_arrange_menu(float pos_x) { m_arrange_settings_dialog.render(pos_x, m_main_toolbar.get_height()); @@ -5395,30 +5319,6 @@ bool GLCanvas3D::_init_main_toolbar() if (!m_main_toolbar.add_item(item)) return false; - /* - if (!m_main_toolbar.add_separator()) - return false; - */ - - item.name = "search"; - item.icon_filename = "search_.svg"; - item.tooltip = _u8L("Search") + " [" + GUI::shortkey_ctrl_prefix() + "F]"; - item.sprite_id = 11; - item.left.toggable = true; - item.left.render_callback = [this](float left, float right, float, float) { - if (m_canvas != nullptr) { - if (!m_canvas->HasFocus()) - m_canvas->SetFocus(); - if (_render_search_list(0.5f * (left + right))) - _deactivate_search_toolbar_item(); - } - }; - item.left.action_callback = GLToolbarItem::Default_Action_Callback; - item.visibility_callback = GLToolbarItem::Default_Visibility_Callback; - item.enabling_callback = [this]()->bool { return m_gizmos.get_current_type() == GLGizmosManager::Undefined; }; - if (!m_main_toolbar.add_item(item)) - return false; - if (!m_main_toolbar.add_separator()) return false; @@ -7653,11 +7553,6 @@ bool GLCanvas3D::_deactivate_undo_redo_toolbar_items() return false; } -bool GLCanvas3D::is_search_pressed() const -{ - return m_main_toolbar.is_item_pressed("search"); -} - bool GLCanvas3D::_deactivate_arrange_menu() { if (m_main_toolbar.is_item_pressed("arrange")) { @@ -7668,26 +7563,6 @@ bool GLCanvas3D::_deactivate_arrange_menu() return false; } -bool GLCanvas3D::_deactivate_search_toolbar_item() -{ - if (is_search_pressed()) { - m_main_toolbar.force_left_action(m_main_toolbar.get_item_id("search"), *this); - return true; - } - - return false; -} - -bool GLCanvas3D::_activate_search_toolbar_item() -{ - if (!m_main_toolbar.is_item_pressed("search")) { - m_main_toolbar.force_left_action(m_main_toolbar.get_item_id("search"), *this); - return true; - } - - return false; -} - bool GLCanvas3D::_deactivate_collapse_toolbar_items() { GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 0660ca7cc9..5f714aae30 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -780,7 +780,6 @@ public: bool is_layers_editing_enabled() const; bool is_layers_editing_allowed() const; - bool is_search_pressed() const; void reset_layer_height_profile(); void adaptive_layer_height_profile(float quality_factor); @@ -1064,7 +1063,6 @@ private: void _render_sla_slices(); void _render_selection_sidebar_hints(); bool _render_undo_redo_stack(const bool is_undo, float pos_x); - bool _render_search_list(float pos_x); bool _render_arrange_menu(float pos_x); void _render_thumbnail_internal(ThumbnailData& thumbnail_data, const ThumbnailsParams& thumbnail_params, const GLVolumeCollection& volumes, Camera::EType camera_type); // render thumbnail using an off-screen framebuffer @@ -1113,8 +1111,6 @@ private: void _update_selection_from_hover(); bool _deactivate_undo_redo_toolbar_items(); - bool _deactivate_search_toolbar_item(); - bool _activate_search_toolbar_item(); bool _deactivate_collapse_toolbar_items(); bool _deactivate_arrange_menu(); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 7b87097c3b..7a71ca9d5c 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1829,7 +1829,7 @@ bool GUI_App::suppress_round_corners() const wxSize GUI_App::get_min_size(wxWindow* display_win) const { - wxSize min_size(76*m_em_unit, 49 * m_em_unit); + wxSize min_size(120 * m_em_unit, 49 * m_em_unit); const wxDisplay display = wxDisplay(display_win); wxRect display_rect = display.GetGeometry(); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 431c79c80e..8aa32177d3 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1516,7 +1516,7 @@ void MainFrame::init_menubar_as_editor() editMenu->AppendSeparator(); append_menu_item(editMenu, wxID_ANY, _L("Searc&h") + "\tCtrl+F", - _L("Search in settings"), [this](wxCommandEvent&) { m_plater->IsShown() ? m_plater->search() : wxGetApp().show_search_dialog(); }, + _L("Search in settings"), [this](wxCommandEvent&) { wxGetApp().show_search_dialog(); }, "search", nullptr, []() {return true; }, this); } @@ -2055,9 +2055,6 @@ void MainFrame::select_tab(size_t tab/* = size_t(-1)*/) if (tab==0) { if (m_settings_dialog.IsShown()) this->SetFocus(); - // plater should be focused for correct navigation inside search window - if (m_plater->canvas3D()->is_search_pressed()) - m_plater->SetFocus(); return; } // Show/Activate Settings Dialog diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 7f088f8c14..5e9afdc627 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6552,23 +6552,6 @@ void Plater::paste_from_clipboard() p->view3D->get_canvas3d()->get_selection().paste_from_clipboard(); } -void Plater::search() -{ - if (is_preview_shown()) - return; - // plater should be focused for correct navigation inside search window - this->SetFocus(); - - wxKeyEvent evt; -#ifdef __APPLE__ - evt.m_keyCode = 'f'; -#else /* __APPLE__ */ - evt.m_keyCode = WXK_CONTROL_F; -#endif /* __APPLE__ */ - evt.SetControlDown(true); - canvas3D()->on_char(evt); -} - void Plater::msw_rescale() { p->preview->msw_rescale(); diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 80f07e4f40..915948f580 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -284,7 +284,6 @@ public: void copy_selection_to_clipboard(); void paste_from_clipboard(); - void search(); void mirror(Axis axis); void split_object(); void split_volume(); diff --git a/src/slic3r/GUI/Search.cpp b/src/slic3r/GUI/Search.cpp index 4fcd2d0f9d..5792316a42 100644 --- a/src/slic3r/GUI/Search.cpp +++ b/src/slic3r/GUI/Search.cpp @@ -306,6 +306,7 @@ bool OptionsSearcher::search(const std::string& search, bool force/* = false*/) OptionsSearcher::OptionsSearcher() { + default_string = _L("Enter a search term"); } OptionsSearcher::~OptionsSearcher() @@ -423,18 +424,22 @@ Option OptionsSearcher::get_option(const std::string& opt_key, const wxString& l void OptionsSearcher::show_dialog() { - if (!search_dialog) { + if (!search_dialog) search_dialog = new SearchDialog(this); - auto parent = search_dialog->GetParent(); - wxPoint pos = parent->ClientToScreen(wxPoint(0, 0)); - pos.x += em_unit(parent) * 40; - pos.y += em_unit(parent) * 4; + wxSize srch_sz = search_input->GetSize(); + if (search_dialog->GetPosition().x != search_input->GetPosition().x) + search_dialog->SetPosition(search_input->GetScreenPosition() + wxPoint(0, srch_sz.y)); - search_dialog->SetPosition(pos); - } + wxSize dlg_sz = search_dialog->GetSize(); + if (dlg_sz.x < srch_sz.x) + search_dialog->SetSize(wxSize(srch_sz.x, dlg_sz.y)); + + search_string(); + search_input->SetSelection(-1,-1); search_dialog->Popup(); + search_input->SetFocus(); } void OptionsSearcher::dlg_sys_color_changed() @@ -449,6 +454,42 @@ void OptionsSearcher::dlg_msw_rescale() search_dialog->msw_rescale(); } +void OptionsSearcher::set_search_input(TextInput* input_ctrl) +{ + search_input = input_ctrl; + + search_input->Bind(wxEVT_TEXT, [this](wxEvent& e) + { + if (search_dialog && search_dialog->IsShown()) + search_dialog->input_text(search_input->GetValue()); + else { + GUI::wxGetApp().check_and_update_searcher(GUI::wxGetApp().get_mode()); + show_dialog(); + } + }); + + wxTextCtrl* ctrl = search_input->GetTextCtrl(); + ctrl->SetToolTip(GUI::format_wxstr(_L("Search in settings [%1%]"), "Ctrl+F")); + + ctrl->Bind(wxEVT_KEY_DOWN, [this](wxKeyEvent& e) + { + if (e.GetKeyCode() == WXK_TAB) + search_input->Navigate(e.ShiftDown() ? wxNavigationKeyEvent::IsBackward : wxNavigationKeyEvent::IsForward); + else if (e.GetKeyCode() == WXK_ESCAPE) + search_dialog->EndModal(wxID_CLOSE); + else if (search_dialog) + search_dialog->KeyDown(e); + e.Skip(); + }); + + ctrl->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& event) + { + if (search_input->GetValue() == default_string) + search_input->SetValue(""); + event.Skip(); + }); +} + void OptionsSearcher::add_key(const std::string& opt_key, Preset::Type type, const wxString& group, const wxString& category) { groups_and_categories[get_key(opt_key, type)] = GroupAndCategory{group, category}; @@ -469,7 +510,7 @@ static const std::map icon_idxs = { }; SearchDialog::SearchDialog(OptionsSearcher* searcher) - : GUI::DPIDialog(GUI::wxGetApp().tab_panel(), wxID_ANY, _L("Search"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER), + : GUI::DPIDialog(GUI::wxGetApp().tab_panel(), wxID_ANY, _L("Search"), wxDefaultPosition, wxDefaultSize, wxSTAY_ON_TOP | wxRESIZE_BORDER), searcher(searcher) { SetFont(GUI::wxGetApp().normal_font()); @@ -479,13 +520,9 @@ SearchDialog::SearchDialog(OptionsSearcher* searcher) SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); #endif - default_string = _L("Enter a search term"); int border = 10; int em = em_unit(); - search_line = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER); - GUI::wxGetApp().UpdateDarkUI(search_line); - search_list = new wxDataViewCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(em * 40, em * 30), wxDV_NO_HEADER | wxDV_SINGLE #ifdef _WIN32 | wxBORDER_SIMPLE @@ -531,15 +568,9 @@ SearchDialog::SearchDialog(OptionsSearcher* searcher) wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); - topSizer->Add(search_line, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border); topSizer->Add(search_list, 1, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border); topSizer->Add(check_sizer, 0, wxEXPAND | wxALL, border); - search_line->Bind(wxEVT_TEXT, &SearchDialog::OnInputText, this); - search_line->Bind(wxEVT_LEFT_UP, &SearchDialog::OnLeftUpInTextCtrl, this); - // process wxEVT_KEY_DOWN to navigate inside search_list, if ArrowUp/Down was pressed - search_line->Bind(wxEVT_KEY_DOWN,&SearchDialog::OnKeyDown, this); - search_list->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, &SearchDialog::OnSelect, this); search_list->Bind(wxEVT_DATAVIEW_ITEM_ACTIVATED, &SearchDialog::OnActivate, this); #ifdef __WXMSW__ @@ -573,11 +604,6 @@ SearchDialog::~SearchDialog() void SearchDialog::Popup(wxPoint position /*= wxDefaultPosition*/) { - const std::string& line = searcher->search_string(); - search_line->SetValue(line.empty() ? default_string : from_u8(line)); - search_line->SetFocus(); - search_line->SelectAll(); - update_list(); const OptionViewParameters& params = searcher->view_params; @@ -587,7 +613,7 @@ void SearchDialog::Popup(wxPoint position /*= wxDefaultPosition*/) if (position != wxDefaultPosition) this->SetPosition(position); - this->ShowModal(); + this->Show(); } void SearchDialog::ProcessSelection(wxDataViewItem selection) @@ -606,10 +632,9 @@ void SearchDialog::ProcessSelection(wxDataViewItem selection) wxPostEvent(GUI::wxGetApp().mainframe, event); } -void SearchDialog::OnInputText(wxCommandEvent&) +void SearchDialog::input_text(wxString input_string) { - wxString input_string = search_line->GetValue(); - if (input_string == default_string) + if (input_string == searcher->default_string) input_string.Clear(); searcher->search(into_u8(input_string)); @@ -617,14 +642,6 @@ void SearchDialog::OnInputText(wxCommandEvent&) update_list(); } -void SearchDialog::OnLeftUpInTextCtrl(wxEvent& event) -{ - if (search_line->GetValue() == default_string) - search_line->SetValue(""); - - event.Skip(); -} - void SearchDialog::OnKeyDown(wxKeyEvent& event) { int key = event.GetKeyCode(); @@ -749,7 +766,7 @@ void SearchDialog::on_sys_color_changed() #ifdef _WIN32 GUI::wxGetApp().UpdateAllStaticTextDarkUI(this); GUI::wxGetApp().UpdateDarkUI(static_cast(this->FindWindowById(wxID_CANCEL, this)), true); - for (wxWindow* win : std::vector {search_line, search_list, check_category, check_english}) + for (wxWindow* win : std::vector {search_list, check_category, check_english}) if (win) GUI::wxGetApp().UpdateDarkUI(win); #endif diff --git a/src/slic3r/GUI/Search.hpp b/src/slic3r/GUI/Search.hpp index 571448d492..cc018ab2e5 100644 --- a/src/slic3r/GUI/Search.hpp +++ b/src/slic3r/GUI/Search.hpp @@ -27,6 +27,7 @@ #include "Widgets/CheckBox.hpp" class CheckBox; +class TextInput; namespace Slic3r { @@ -91,6 +92,8 @@ class OptionsSearcher std::map groups_and_categories; PrinterTechnology printer_technology {ptAny}; ConfigOptionMode mode{ comUndef }; + TextInput* search_input { nullptr }; + SearchDialog* search_dialog { nullptr }; std::vector