mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-01 18:30:36 +08:00

Added menu item "Window->Compare presets" to compare more than one type of presets. Code refactoring for PresetComboBox: Use suffix "modified" just for PlaterPresetComboBox and TabPresetComboBox Code refactoring. wxDataViewCtrl and related functions extracted from DiffPresetDialog and UnsavedChangesDialog to the separate class DiffViewCtrl Code refactoring, Tab.cpp: Build all unregular pages on a first build of the Printer Settings Squashed commit of the following: commit 91f45a8a2d97d252337c7306dd02db607fd79c00 Author: Vojtech Bubnik <bubnikv@gmail.com> Date: Thu Feb 4 09:34:29 2021 +0100 Fixed after merge commit 09aa502498b08c059ecdf334f5db1567739b4520 Merge: 6df8e83e1 0baa92fab Author: Vojtech Bubnik <bubnikv@gmail.com> Date: Thu Feb 4 09:31:43 2021 +0100 Merge remote-tracking branch 'remotes/origin/master' into ys_diff_dlg commit 6df8e83e1af3ba096ac39d25985b6deb2e0a245b Author: Vojtech Bubnik <bubnikv@gmail.com> Date: Thu Feb 4 09:29:53 2021 +0100 Tiny beautification. commit e781ceaaf7c39bc073476409cc02918d9f182930 Author: Vojtech Bubnik <bubnikv@gmail.com> Date: Wed Feb 3 18:05:19 2021 +0100 Reworked copying of PresetBundles: 1) Simplified by using the default copy constructors and copy operators. 2) Made safer by not allowing PresetCollection and PhysicalPrinterPresetCollection to be copied or instantiated outside of PresetBundle. 3) Fixed Preset::vendor pointers after copying PresetBundle. commit a8f0b7aa5156465cdb3e3dbb86feb66a64bcebc0 Author: YuSanka <yusanka@gmail.com> Date: Mon Jan 25 16:13:53 2021 +0100 DiffPresetsDialog: Show compatibility to print/printer presets selected in DiffPresetDialog commit 597451f930a4330376966d8cf3350056d4f85a73 Merge: cce5b5710 59017a7da Author: YuSanka <yusanka@gmail.com> Date: Thu Jan 21 12:14:48 2021 +0100 Merge remote-tracking branch 'origin/master' into ys_diff_dlg commit cce5b5710d1225c7eaa52d0abb4b3f66fbd3b6a1 Author: YuSanka <yusanka@gmail.com> Date: Thu Jan 21 12:11:40 2021 +0100 DiffPresetDialog: Fixed crash on ASAN build commit ad8d728d89d7a75c2ac136ea8cdbb730ab774cd9 Author: YuSanka <yusanka@gmail.com> Date: Wed Jan 20 16:38:28 2021 +0100 FullCompareDialog improvements commit 316bafbeec9bb63f731b653d296062d9e22dd02f Author: YuSanka <yusanka@gmail.com> Date: Wed Jan 20 09:25:46 2021 +0100 DiffPresetDialog improvements: * Update presets lists after save changes in edited preset or change printer_technology * Tab.cpp: Build all unregular pages on a first build of the Printer Settings commit 01171c8ef50389d0801b0ccc5746ab0c3b731b11 Author: YuSanka <yusanka@gmail.com> Date: Tue Jan 19 17:26:28 2021 +0100 DiffPresetDialog : improvements * This dialog is non-modal now * "Compare presets" menu item is moved from "View" to the "Window" menu group * Added info tooltips for the bitmap buttons between presets * Added "Show all presets" checkbox * Show full difference between printer presets with different count of extruders commit 3d38b62f3c9de8aab352ed3bcff297d5c0239b2e Merge: e50fe6de9 9a2310ae9 Author: YuSanka <yusanka@gmail.com> Date: Mon Jan 18 10:00:18 2021 +0100 Merge remote-tracking branch 'origin/master' into ys_diff_dlg commit e50fe6de984decadfef3d4b952f0eec8ab9e6670 Author: YuSanka <yusanka@gmail.com> Date: Sat Jan 16 02:27:24 2021 +0100 DiffPresetDialog improvements Added menu item "View->Compare presets" to compare more than one type of presets commit bf08b7c8c969ad0ca631b9eeac1bc231f474e72b Author: YuSanka <yusanka@gmail.com> Date: Sat Jan 16 00:28:39 2021 +0100 Code refactoring. wxDataViewCtrl and related functions extracted from DiffPresetDialog and UnsavedChangesDialog to the separate class DiffViewCtrl commit 7aeb63032b0bc2bd06e60990c060008660a5c44f Author: YuSanka <yusanka@gmail.com> Date: Fri Jan 15 21:35:43 2021 +0100 DiffPresetDialog: first implementation commit 2f23d5af9d6b5dd670dfb7d06eedbe0e6d2960c6 Author: YuSanka <yusanka@gmail.com> Date: Thu Jan 14 16:28:43 2021 +0100 Code refactoring for PresetComboBox. Use suffix "modified" just for PlaterPresetComboBox and TabPresetComboBox
220 lines
6.6 KiB
C++
220 lines
6.6 KiB
C++
#ifndef slic3r_SearchComboBox_hpp_
|
|
#define slic3r_SearchComboBox_hpp_
|
|
|
|
#include <vector>
|
|
#include <map>
|
|
|
|
#include <wx/panel.h>
|
|
#include <wx/sizer.h>
|
|
#include <wx/listctrl.h>
|
|
|
|
#include <wx/combo.h>
|
|
|
|
#include <wx/checkbox.h>
|
|
#include <wx/dialog.h>
|
|
|
|
#include "GUI_Utils.hpp"
|
|
#include "wxExtensions.hpp"
|
|
#include "libslic3r/Preset.hpp"
|
|
|
|
|
|
namespace Slic3r {
|
|
|
|
namespace Search{
|
|
|
|
class SearchDialog;
|
|
|
|
struct InputInfo
|
|
{
|
|
DynamicPrintConfig* config {nullptr};
|
|
Preset::Type type {Preset::TYPE_INVALID};
|
|
ConfigOptionMode mode {comSimple};
|
|
};
|
|
|
|
struct GroupAndCategory {
|
|
wxString group;
|
|
wxString category;
|
|
};
|
|
|
|
struct Option {
|
|
// bool operator<(const Option& other) const { return other.label > this->label; }
|
|
bool operator<(const Option& other) const { return other.opt_key > this->opt_key; }
|
|
|
|
// Fuzzy matching works at a character level. Thus matching with wide characters is a safer bet than with short characters,
|
|
// though for some languages (Chinese?) it may not work correctly.
|
|
std::wstring opt_key;
|
|
Preset::Type type {Preset::TYPE_INVALID};
|
|
std::wstring label;
|
|
std::wstring label_local;
|
|
std::wstring group;
|
|
std::wstring group_local;
|
|
std::wstring category;
|
|
std::wstring category_local;
|
|
};
|
|
|
|
struct FoundOption {
|
|
// UTF8 encoding, to be consumed by ImGUI by reference.
|
|
std::string label;
|
|
std::string marked_label;
|
|
std::string tooltip;
|
|
size_t option_idx {0};
|
|
int outScore {0};
|
|
|
|
// Returning pointers to contents of std::string members, to be used by ImGUI for rendering.
|
|
void get_marked_label_and_tooltip(const char** label, const char** tooltip) const;
|
|
};
|
|
|
|
struct OptionViewParameters
|
|
{
|
|
bool category {false};
|
|
bool english {false};
|
|
|
|
int hovered_id {0};
|
|
};
|
|
|
|
class OptionsSearcher
|
|
{
|
|
std::string search_line;
|
|
std::map<std::string, GroupAndCategory> groups_and_categories;
|
|
PrinterTechnology printer_technology;
|
|
|
|
std::vector<Option> options {};
|
|
std::vector<FoundOption> found {};
|
|
|
|
void append_options(DynamicPrintConfig* config, Preset::Type type, ConfigOptionMode mode);
|
|
|
|
void sort_options() {
|
|
std::sort(options.begin(), options.end(), [](const Option& o1, const Option& o2) {
|
|
return o1.label < o2.label; });
|
|
}
|
|
void sort_found() {
|
|
std::sort(found.begin(), found.end(), [](const FoundOption& f1, const FoundOption& f2) {
|
|
return f1.outScore > f2.outScore || (f1.outScore == f2.outScore && f1.label < f2.label); });
|
|
};
|
|
|
|
size_t options_size() const { return options.size(); }
|
|
size_t found_size() const { return found.size(); }
|
|
|
|
public:
|
|
OptionViewParameters view_params;
|
|
|
|
SearchDialog* search_dialog { nullptr };
|
|
|
|
OptionsSearcher();
|
|
~OptionsSearcher();
|
|
|
|
void init(std::vector<InputInfo> input_values);
|
|
void apply(DynamicPrintConfig *config,
|
|
Preset::Type type,
|
|
ConfigOptionMode mode);
|
|
bool search();
|
|
bool search(const std::string& search, bool force = false);
|
|
|
|
void add_key(const std::string& opt_key, const wxString& group, const wxString& category);
|
|
|
|
size_t size() const { return found_size(); }
|
|
|
|
const FoundOption& operator[](const size_t pos) const noexcept { return found[pos]; }
|
|
const Option& get_option(size_t pos_in_filter) const;
|
|
const Option& get_option(const std::string& opt_key) const;
|
|
Option get_option(const std::string& opt_key, const wxString& label, Preset::Type type) const;
|
|
|
|
const std::vector<FoundOption>& found_options() { return found; }
|
|
const GroupAndCategory& get_group_and_category (const std::string& opt_key) { return groups_and_categories[opt_key]; }
|
|
std::string& search_string() { return search_line; }
|
|
|
|
void set_printer_technology(PrinterTechnology pt) { printer_technology = pt; }
|
|
|
|
void sort_options_by_opt_key() {
|
|
std::sort(options.begin(), options.end(), [](const Option& o1, const Option& o2) {
|
|
return o1.opt_key < o2.opt_key; });
|
|
}
|
|
};
|
|
|
|
|
|
//------------------------------------------
|
|
// SearchDialog
|
|
//------------------------------------------
|
|
class SearchListModel;
|
|
class SearchDialog : public GUI::DPIDialog
|
|
{
|
|
wxString search_str;
|
|
wxString default_string;
|
|
|
|
bool prevent_list_events {false};
|
|
|
|
wxTextCtrl* search_line { nullptr };
|
|
wxDataViewCtrl* search_list { nullptr };
|
|
SearchListModel* search_list_model { nullptr };
|
|
wxCheckBox* check_category { nullptr };
|
|
wxCheckBox* check_english { nullptr };
|
|
|
|
OptionsSearcher* searcher { nullptr };
|
|
|
|
void OnInputText(wxCommandEvent& event);
|
|
void OnLeftUpInTextCtrl(wxEvent& event);
|
|
void OnKeyDown(wxKeyEvent& event);
|
|
|
|
void OnActivate(wxDataViewEvent& event);
|
|
void OnSelect(wxDataViewEvent& event);
|
|
|
|
void OnCheck(wxCommandEvent& event);
|
|
void OnMotion(wxMouseEvent& event);
|
|
void OnLeftDown(wxMouseEvent& event);
|
|
|
|
void update_list();
|
|
|
|
public:
|
|
SearchDialog(OptionsSearcher* searcher);
|
|
~SearchDialog() {}
|
|
|
|
void Popup(wxPoint position = wxDefaultPosition);
|
|
void ProcessSelection(wxDataViewItem selection);
|
|
|
|
protected:
|
|
void on_dpi_changed(const wxRect& suggested_rect) override;
|
|
void on_sys_color_changed() override;
|
|
};
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// SearchListModel
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class SearchListModel : public wxDataViewVirtualListModel
|
|
{
|
|
std::vector<std::pair<wxString, int>> m_values;
|
|
ScalableBitmap m_icon[5];
|
|
|
|
public:
|
|
enum {
|
|
colIcon,
|
|
colMarkedText,
|
|
colMax
|
|
};
|
|
|
|
SearchListModel(wxWindow* parent);
|
|
|
|
// helper methods to change the model
|
|
|
|
void Clear();
|
|
void Prepend(const std::string& text);
|
|
void msw_rescale();
|
|
|
|
// implementation of base class virtuals to define model
|
|
|
|
unsigned int GetColumnCount() const override { return colMax; }
|
|
wxString GetColumnType(unsigned int col) const override;
|
|
void GetValueByRow(wxVariant& variant, unsigned int row, unsigned int col) const override;
|
|
bool GetAttrByRow(unsigned int row, unsigned int col, wxDataViewItemAttr& attr) const override { return true; }
|
|
bool SetValueByRow(const wxVariant& variant, unsigned int row, unsigned int col) override { return false; }
|
|
};
|
|
|
|
|
|
|
|
|
|
} // Search namespace
|
|
}
|
|
|
|
#endif //slic3r_SearchComboBox_hpp_
|