From 91897589928789b261ca0dc735ffd46f2b0b99f2 Mon Sep 17 00:00:00 2001
From: YuSanka <yusanka@gmail.com>
Date: Thu, 7 May 2020 18:39:38 +0200
Subject: [PATCH] Search: 1.Select first item in the search list by default 2.
 Show "Search in English" checkbox only, when Slicer is localized 3. Suppress
 search window hiding when leave the 3D-scene

---
 src/slic3r/GUI/GLCanvas3D.cpp   | 11 +++++------
 src/slic3r/GUI/GUI_App.hpp      |  1 +
 src/slic3r/GUI/ImGuiWrapper.cpp | 19 +++++++++----------
 src/slic3r/GUI/ImGuiWrapper.hpp |  2 +-
 src/slic3r/GUI/MainFrame.cpp    |  5 +++++
 src/slic3r/GUI/Search.cpp       | 11 +++++++----
 src/slic3r/GUI/Search.hpp       |  2 +-
 7 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp
index a47473861..4b719f039 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -3567,7 +3567,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
     else if (evt.Leaving())
     {
         _deactivate_undo_redo_toolbar_items();
-        _deactivate_search_toolbar_item();
 
         // to remove hover on objects when the mouse goes out of this canvas
         m_mouse.position = Vec2d(-1.0, -1.0);
@@ -4386,7 +4385,6 @@ bool GLCanvas3D::_render_search_list(float pos_x) const
 
     int selected = -1;
     bool edited = false;
-    bool check_changed = false;
     float em = static_cast<float>(wxGetApp().em_unit());
 #if ENABLE_RETINA_GL
 	em *= m_retina_helper->get_scale_factor();
@@ -4400,7 +4398,7 @@ bool GLCanvas3D::_render_search_list(float pos_x) const
 
     imgui->search_list(ImVec2(45 * em, 30 * em), &search_string_getter, s, 
                        sidebar.get_searcher().view_params,
-                       selected, edited, m_mouse_wheel);
+                       selected, edited, m_mouse_wheel, wxGetApp().is_localized());
 
     search_line = s;
     delete [] s;
@@ -4410,11 +4408,12 @@ bool GLCanvas3D::_render_search_list(float pos_x) const
     if (edited)
         sidebar.search();
 
-    if (selected != size_t(-1)) {
+    if (selected >= 0) {
         // selected == 9999 means that Esc kye was pressed
-        if (selected != 9999)
+        if (selected == 9999)
+            action_taken = true;
+        else
             sidebar.jump_to_option(selected);
-        action_taken = true;
     }
 
     imgui->end();
diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp
index 50c771879..cd59f1d80 100644
--- a/src/slic3r/GUI/GUI_App.hpp
+++ b/src/slic3r/GUI/GUI_App.hpp
@@ -162,6 +162,7 @@ public:
     wxString        current_language_code() const { return m_wxLocale->GetCanonicalName(); }
 	// Translate the language code to a code, for which Prusa Research maintains translations. Defaults to "en_US".
     wxString 		current_language_code_safe() const;
+    bool            is_localized() const { return m_wxLocale->GetLocale() != "English"; }
 
     virtual bool OnExceptionInMainLoop() override;
 
diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp
index 4385fa276..755d84180 100644
--- a/src/slic3r/GUI/ImGuiWrapper.cpp
+++ b/src/slic3r/GUI/ImGuiWrapper.cpp
@@ -627,8 +627,9 @@ static void process_key_down(ImGuiKey imgui_key, std::function<void()> f)
 }
 
 void ImGuiWrapper::search_list(const ImVec2& size_, bool (*items_getter)(int, const char** label, const char** tooltip), char* search_str,
-                               Search::OptionViewParameters& view_params, int& selected, bool& edited, int& mouse_wheel)
+                               Search::OptionViewParameters& view_params, int& selected, bool& edited, int& mouse_wheel, bool is_localized)
 {
+    int& hovered_id = view_params.hovered_id;
     // ImGui::ListBoxHeader("", size);
     {   
         // rewrote part of function to add a TextInput instead of label Text
@@ -668,7 +669,7 @@ void ImGuiWrapper::search_list(const ImVec2& size_, bool (*items_getter)(int, co
         ImGui::InputTextEx("", NULL, search_str, 20, search_size, ImGuiInputTextFlags_AutoSelectAll, NULL, NULL);
         edited = ImGui::IsItemEdited();
         if (edited)
-            view_params.hovered_id = -1;
+            hovered_id = 0;
 
         process_key_down(ImGuiKey_Escape, [&selected, search_str, str]() {
             // use 9999 to mark selection as a Esc key
@@ -684,7 +685,6 @@ void ImGuiWrapper::search_list(const ImVec2& size_, bool (*items_getter)(int, co
     const char* item_text;
     const char* tooltip;
     int mouse_hovered = -1;
-    int& hovered_id = view_params.hovered_id;
 
     while (items_getter(i, &item_text, &tooltip))
     {
@@ -692,7 +692,7 @@ void ImGuiWrapper::search_list(const ImVec2& size_, bool (*items_getter)(int, co
 
         if (ImGui::IsItemHovered()) {
             ImGui::SetTooltip("%s", /*item_text*/tooltip);
-            view_params.hovered_id = -1;
+                hovered_id = -1;
             mouse_hovered = i;
         }
 
@@ -701,8 +701,6 @@ void ImGuiWrapper::search_list(const ImVec2& size_, bool (*items_getter)(int, co
         i++;
     }
 
-    scroll_y(mouse_hovered);
-
     // Process mouse wheel
     if (mouse_hovered > 0)
         process_mouse_wheel(mouse_wheel);
@@ -712,7 +710,7 @@ void ImGuiWrapper::search_list(const ImVec2& size_, bool (*items_getter)(int, co
         if (mouse_hovered > 0)
             scroll_up();
         else {
-            if (hovered_id > 0 && hovered_id != size_t(-1))
+            if (hovered_id > 0)
                 --hovered_id;
             scroll_y(hovered_id);
         }
@@ -722,9 +720,9 @@ void ImGuiWrapper::search_list(const ImVec2& size_, bool (*items_getter)(int, co
         if (mouse_hovered > 0)
             scroll_down();
         else {
-            if (hovered_id == size_t(-1))
+            if (hovered_id < 0)
                 hovered_id = 0;
-            else if (hovered_id < size_t(i - 1))
+            else if (hovered_id < i - 1)
                 ++hovered_id;
             scroll_y(hovered_id);
         }
@@ -750,7 +748,8 @@ void ImGuiWrapper::search_list(const ImVec2& size_, bool (*items_getter)(int, co
     text(_L("Use for search")+":");
     check_box(_L("Category"),   view_params.category);
     check_box(_L("Group"),      view_params.group);
-    check_box(_L("Search in English"), view_params.english);
+    if (is_localized)
+        check_box(_L("Search in English"), view_params.english);
 }
 
 void ImGuiWrapper::disabled_begin(bool disabled)
diff --git a/src/slic3r/GUI/ImGuiWrapper.hpp b/src/slic3r/GUI/ImGuiWrapper.hpp
index efb8acc9a..bf542e138 100644
--- a/src/slic3r/GUI/ImGuiWrapper.hpp
+++ b/src/slic3r/GUI/ImGuiWrapper.hpp
@@ -79,7 +79,7 @@ public:
     bool combo(const wxString& label, const std::vector<std::string>& options, int& selection);   // Use -1 to not mark any option as selected
     bool undo_redo_list(const ImVec2& size, const bool is_undo, bool (*items_getter)(const bool, int, const char**), int& hovered, int& selected, int& mouse_wheel);
     void search_list(const ImVec2& size, bool (*items_getter)(int, const char** label, const char** tooltip), char* search_str,
-                     Search::OptionViewParameters& view_params, int& selected, bool& edited, int& mouse_wheel);
+                     Search::OptionViewParameters& view_params, int& selected, bool& edited, int& mouse_wheel, bool is_localized);
 
     void disabled_begin(bool disabled);
     void disabled_end();
diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp
index 2b16e92d6..d05e4bd77 100644
--- a/src/slic3r/GUI/MainFrame.cpp
+++ b/src/slic3r/GUI/MainFrame.cpp
@@ -1267,7 +1267,12 @@ void MainFrame::select_tab(size_t tab/* = size_t(-1)*/)
         }
         // Show/Activate Settings Dialog
         if (m_settings_dialog->IsShown())
+#ifdef __WXOSX__ // Don't call SetFont under OSX to avoid name cutting in ObjectList
             m_settings_dialog->Hide();
+#else
+            m_settings_dialog->SetFocus();
+        else
+#endif
         m_settings_dialog->Show();
     }
     else if (m_layout == slNew) {
diff --git a/src/slic3r/GUI/Search.cpp b/src/slic3r/GUI/Search.cpp
index 33f097362..aef46bf55 100644
--- a/src/slic3r/GUI/Search.cpp
+++ b/src/slic3r/GUI/Search.cpp
@@ -434,13 +434,15 @@ SearchDialog::SearchDialog(OptionsSearcher* searcher)
 
     check_category  = new wxCheckBox(this, wxID_ANY, _L("Category"));
     check_group     = new wxCheckBox(this, wxID_ANY, _L("Group"));
-    check_english   = new wxCheckBox(this, wxID_ANY, _L("Search in English"));
+    if (GUI::wxGetApp().is_localized())
+        check_english   = new wxCheckBox(this, wxID_ANY, _L("Search in English"));
 
     wxStdDialogButtonSizer* cancel_btn = this->CreateStdDialogButtonSizer(wxCANCEL);
 
     check_sizer->Add(check_category, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, border);
-    check_sizer->Add(check_group,    0, wxALIGN_CENTER_VERTICAL | wxRIGHT, border);
-    check_sizer->Add(check_english,  0, wxALIGN_CENTER_VERTICAL | wxRIGHT, border);
+    check_sizer->Add(check_group,    0, wxALIGN_CENTER_VERTICAL | wxRIGHT, border); 
+    if (GUI::wxGetApp().is_localized())
+        check_sizer->Add(check_english,  0, wxALIGN_CENTER_VERTICAL | wxRIGHT, border);
     check_sizer->AddStretchSpacer(border);
     check_sizer->Add(cancel_btn,     0, wxALIGN_CENTER_VERTICAL);
 
@@ -459,7 +461,8 @@ SearchDialog::SearchDialog(OptionsSearcher* searcher)
     search_list->Bind(wxEVT_LEFT_UP, &SearchDialog::OnMouseClick, this);
     search_list->Bind(wxEVT_KEY_DOWN,&SearchDialog::OnKeyDown, this);
 
-    check_english ->Bind(wxEVT_CHECKBOX, &SearchDialog::OnCheck, this);
+    if (GUI::wxGetApp().is_localized())
+        check_english ->Bind(wxEVT_CHECKBOX, &SearchDialog::OnCheck, this);
     check_category->Bind(wxEVT_CHECKBOX, &SearchDialog::OnCheck, this);
     check_group   ->Bind(wxEVT_CHECKBOX, &SearchDialog::OnCheck, this);
 
diff --git a/src/slic3r/GUI/Search.hpp b/src/slic3r/GUI/Search.hpp
index 60ef16c0f..291633a2b 100644
--- a/src/slic3r/GUI/Search.hpp
+++ b/src/slic3r/GUI/Search.hpp
@@ -70,7 +70,7 @@ struct OptionViewParameters
     bool group      {true };
     bool english    {false};
 
-    int  hovered_id {-1};
+    int  hovered_id {0};
 };
 
 class OptionsSearcher