mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-02 06:30:38 +08:00
Search improvements:
* Set max size. * Close search dialog, when both of search dialog and search input lose a focus * Update dialog position in respect to the position and size of search input
This commit is contained in:
parent
161d3f40d4
commit
1c4b9d43d1
@ -1113,6 +1113,10 @@ void GUI_App::jump_to_option(const std::string& composite_key)
|
|||||||
|
|
||||||
void GUI_App::show_search_dialog()
|
void GUI_App::show_search_dialog()
|
||||||
{
|
{
|
||||||
|
// To avoid endless loop caused by mutual lose focuses from serch_input and search_dialog
|
||||||
|
// invoke killFocus for serch_input by set focus to tab_panel
|
||||||
|
GUI::wxGetApp().tab_panel()->SetFocus();
|
||||||
|
|
||||||
check_and_update_searcher(get_mode());
|
check_and_update_searcher(get_mode());
|
||||||
m_searcher->show_dialog();
|
m_searcher->show_dialog();
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
#include "libslic3r/PrintConfig.hpp"
|
#include "libslic3r/PrintConfig.hpp"
|
||||||
#include "libslic3r/PresetBundle.hpp"
|
#include "libslic3r/PresetBundle.hpp"
|
||||||
#include "GUI_App.hpp"
|
#include "GUI_App.hpp"
|
||||||
|
#include "I18N.hpp"
|
||||||
|
#include "format.hpp"
|
||||||
#include "MainFrame.hpp"
|
#include "MainFrame.hpp"
|
||||||
#include "Tab.hpp"
|
#include "Tab.hpp"
|
||||||
|
|
||||||
@ -422,24 +424,60 @@ Option OptionsSearcher::get_option(const std::string& opt_key, const wxString& l
|
|||||||
return create_option(opt_key, label, type, gc);
|
return create_option(opt_key, label, type, gc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsSearcher::show_dialog()
|
static bool has_focus(wxWindow* win)
|
||||||
{
|
{
|
||||||
if (!search_dialog)
|
if (win->HasFocus())
|
||||||
search_dialog = new SearchDialog(this);
|
return true;
|
||||||
|
|
||||||
wxSize srch_sz = search_input->GetSize();
|
auto children = win->GetChildren();
|
||||||
if (search_dialog->GetPosition().x != search_input->GetPosition().x)
|
for (auto child : children) {
|
||||||
search_dialog->SetPosition(search_input->GetScreenPosition() + wxPoint(0, srch_sz.y));
|
if (has_focus(child))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
wxSize dlg_sz = search_dialog->GetSize();
|
return false;
|
||||||
if (dlg_sz.x < srch_sz.x)
|
}
|
||||||
search_dialog->SetSize(wxSize(srch_sz.x, dlg_sz.y));
|
|
||||||
|
void OptionsSearcher::update_dialog_position()
|
||||||
|
{
|
||||||
|
if (search_dialog) {
|
||||||
|
search_dialog->CenterOnParent(wxHORIZONTAL);
|
||||||
|
search_dialog->SetPosition({ search_dialog->GetPosition().x, search_input->GetScreenPosition().y + search_input->GetSize().y });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OptionsSearcher::show_dialog(bool show /*= true*/)
|
||||||
|
{
|
||||||
|
if (search_dialog && !show) {
|
||||||
|
search_dialog->EndModal(wxID_CLOSE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!search_dialog) {
|
||||||
|
search_dialog = new SearchDialog(this, search_input);
|
||||||
|
update_dialog_position();
|
||||||
|
|
||||||
|
search_dialog->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& e)
|
||||||
|
{
|
||||||
|
if (search_dialog->IsShown() && !search_input->HasFocus())
|
||||||
|
show_dialog(false);
|
||||||
|
e.Skip();
|
||||||
|
});
|
||||||
|
|
||||||
|
search_input->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& e)
|
||||||
|
{
|
||||||
|
e.Skip();
|
||||||
|
if (search_dialog->IsShown() && !has_focus(search_dialog))
|
||||||
|
show_dialog(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
search_string();
|
search_string();
|
||||||
search_input->SetSelection(-1,-1);
|
search_input->SetSelection(-1,-1);
|
||||||
|
|
||||||
search_dialog->Popup();
|
search_dialog->Popup();
|
||||||
search_input->SetFocus();
|
if (!search_input->HasFocus())
|
||||||
|
search_input->SetFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsSearcher::dlg_sys_color_changed()
|
void OptionsSearcher::dlg_sys_color_changed()
|
||||||
@ -460,12 +498,13 @@ void OptionsSearcher::set_search_input(TextInput* input_ctrl)
|
|||||||
|
|
||||||
search_input->Bind(wxEVT_TEXT, [this](wxEvent& e)
|
search_input->Bind(wxEVT_TEXT, [this](wxEvent& e)
|
||||||
{
|
{
|
||||||
if (search_dialog && search_dialog->IsShown())
|
if (search_dialog) {
|
||||||
search_dialog->input_text(search_input->GetValue());
|
search_dialog->input_text(search_input->GetValue());
|
||||||
else {
|
if (!search_dialog->IsShown())
|
||||||
GUI::wxGetApp().check_and_update_searcher(GUI::wxGetApp().get_mode());
|
search_dialog->Popup();
|
||||||
show_dialog();
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
GUI::wxGetApp().show_search_dialog();
|
||||||
});
|
});
|
||||||
|
|
||||||
wxTextCtrl* ctrl = search_input->GetTextCtrl();
|
wxTextCtrl* ctrl = search_input->GetTextCtrl();
|
||||||
@ -488,6 +527,12 @@ void OptionsSearcher::set_search_input(TextInput* input_ctrl)
|
|||||||
search_input->SetValue("");
|
search_input->SetValue("");
|
||||||
event.Skip();
|
event.Skip();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
search_input->Bind(wxEVT_MOVE, [this](wxMoveEvent& event)
|
||||||
|
{
|
||||||
|
event.Skip();
|
||||||
|
update_dialog_position();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsSearcher::add_key(const std::string& opt_key, Preset::Type type, const wxString& group, const wxString& category)
|
void OptionsSearcher::add_key(const std::string& opt_key, Preset::Type type, const wxString& group, const wxString& category)
|
||||||
@ -509,8 +554,8 @@ static const std::map<const char, int> icon_idxs = {
|
|||||||
{ImGui::PreferencesButton , 5},
|
{ImGui::PreferencesButton , 5},
|
||||||
};
|
};
|
||||||
|
|
||||||
SearchDialog::SearchDialog(OptionsSearcher* searcher)
|
SearchDialog::SearchDialog(OptionsSearcher* searcher, wxWindow* parent)
|
||||||
: GUI::DPIDialog(GUI::wxGetApp().tab_panel(), wxID_ANY, _L("Search"), wxDefaultPosition, wxDefaultSize, wxSTAY_ON_TOP | wxRESIZE_BORDER),
|
: GUI::DPIDialog(parent ? parent : GUI::wxGetApp().tab_panel(), wxID_ANY, _L("Search"), wxDefaultPosition, wxDefaultSize, wxSTAY_ON_TOP | wxRESIZE_BORDER),
|
||||||
searcher(searcher)
|
searcher(searcher)
|
||||||
{
|
{
|
||||||
SetFont(GUI::wxGetApp().normal_font());
|
SetFont(GUI::wxGetApp().normal_font());
|
||||||
|
@ -147,7 +147,8 @@ public:
|
|||||||
}
|
}
|
||||||
void sort_options_by_label() { sort_options(); }
|
void sort_options_by_label() { sort_options(); }
|
||||||
|
|
||||||
void show_dialog();
|
void update_dialog_position();
|
||||||
|
void show_dialog(bool show = true);
|
||||||
void dlg_sys_color_changed();
|
void dlg_sys_color_changed();
|
||||||
void dlg_msw_rescale();
|
void dlg_msw_rescale();
|
||||||
|
|
||||||
@ -184,7 +185,7 @@ class SearchDialog : public GUI::DPIDialog
|
|||||||
void update_list();
|
void update_list();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SearchDialog(OptionsSearcher* searcher);
|
SearchDialog(OptionsSearcher* searcher, wxWindow* parent);
|
||||||
~SearchDialog();
|
~SearchDialog();
|
||||||
|
|
||||||
void Popup(wxPoint position = wxDefaultPosition);
|
void Popup(wxPoint position = wxDefaultPosition);
|
||||||
|
@ -185,6 +185,7 @@ void TopBarItemsCtrl::UpdateAuthMenu()
|
|||||||
void TopBarItemsCtrl::CreateSearch()
|
void TopBarItemsCtrl::CreateSearch()
|
||||||
{
|
{
|
||||||
m_search = new ::TextInput(this, wxGetApp().searcher().default_string, "", "search", wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER);
|
m_search = new ::TextInput(this, wxGetApp().searcher().default_string, "", "search", wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER);
|
||||||
|
m_search->SetMaxSize(wxSize(42*em_unit(this), -1));
|
||||||
wxGetApp().UpdateDarkUI(m_search);
|
wxGetApp().UpdateDarkUI(m_search);
|
||||||
wxGetApp().searcher().set_search_input(m_search);
|
wxGetApp().searcher().set_search_input(m_search);
|
||||||
}
|
}
|
||||||
@ -223,11 +224,13 @@ TopBarItemsCtrl::TopBarItemsCtrl(wxWindow *parent) :
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_buttons_sizer = new wxFlexGridSizer(1, m_btn_margin, m_btn_margin);
|
m_buttons_sizer = new wxFlexGridSizer(1, m_btn_margin, m_btn_margin);
|
||||||
left_sizer->Add(m_buttons_sizer, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, 2 * m_btn_margin);
|
left_sizer->Add(m_buttons_sizer, 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, 2 * m_btn_margin);
|
||||||
|
|
||||||
CreateSearch();
|
CreateSearch();
|
||||||
|
|
||||||
left_sizer->Add(m_search, 1, wxALIGN_CENTER_VERTICAL | wxLEFT, 3 * m_btn_margin);
|
wxBoxSizer* search_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
search_sizer->Add(m_search, 0, wxEXPAND | wxALIGN_RIGHT);
|
||||||
|
left_sizer->Add(search_sizer, 1, wxALIGN_CENTER_VERTICAL);
|
||||||
|
|
||||||
m_sizer->Add(left_sizer, 1, wxEXPAND);
|
m_sizer->Add(left_sizer, 1, wxEXPAND);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user