mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Added SettingsDigest
This commit is contained in:
		
							parent
							
								
									af6a312fea
								
							
						
					
					
						commit
						f471362e86
					
				
					 5 changed files with 78 additions and 14 deletions
				
			
		| 
						 | 
				
			
			@ -182,6 +182,8 @@ bool select_language(wxArrayString & names, wxArrayLong & identifiers);
 | 
			
		|||
// update right panel of the Plater according to view mode
 | 
			
		||||
void update_mode();
 | 
			
		||||
 | 
			
		||||
void show_info_sizer(bool show);
 | 
			
		||||
 | 
			
		||||
std::vector<Tab *>& get_tabs_list();
 | 
			
		||||
bool checked_tab(Tab* tab);
 | 
			
		||||
void delete_tab_from_list(Tab* tab);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -69,8 +69,6 @@ bool m_part_settings_changed = false;
 | 
			
		|||
    wxString g_selected_extruder = "";
 | 
			
		||||
#endif //__WXOSX__
 | 
			
		||||
 | 
			
		||||
// typedef std::map<std::string, std::string> t_category_icon;
 | 
			
		||||
typedef std::map<std::string, wxBitmap> t_category_icon;
 | 
			
		||||
inline t_category_icon& get_category_icon() {
 | 
			
		||||
	static t_category_icon CATEGORY_ICON;
 | 
			
		||||
	if (CATEGORY_ICON.empty()){
 | 
			
		||||
| 
						 | 
				
			
			@ -896,6 +894,7 @@ void update_settings_list()
 | 
			
		|||
		std::map<std::string, std::vector<std::string>> cat_options;
 | 
			
		||||
		auto opt_keys = (*m_config)->keys();
 | 
			
		||||
        m_og_settings.resize(0);
 | 
			
		||||
        std::vector<std::string> categories;
 | 
			
		||||
        if (!(opt_keys.size() == 1 && opt_keys[0] == "extruder"))// return;
 | 
			
		||||
        {
 | 
			
		||||
            auto extruders_cnt = get_preset_bundle()->printers.get_selected_preset().printer_technology() == ptSLA ? 1 :
 | 
			
		||||
| 
						 | 
				
			
			@ -933,6 +932,8 @@ void update_settings_list()
 | 
			
		|||
                optgroup->reload_config();
 | 
			
		||||
                m_option_sizer->Add(optgroup->sizer, 0, wxEXPAND | wxALL, 0);
 | 
			
		||||
                m_og_settings.push_back(optgroup);
 | 
			
		||||
 | 
			
		||||
                categories.push_back(cat.first);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -940,11 +941,15 @@ void update_settings_list()
 | 
			
		|||
            m_objects_ctrl->Select(m_objects_model->Delete(item));
 | 
			
		||||
            part_selection_changed();
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        else {
 | 
			
		||||
            if (!categories.empty())
 | 
			
		||||
                m_objects_model->UpdateSettingsDigest(item, categories);
 | 
			
		||||
            show_manipulations = false;
 | 
			
		||||
        }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    show_manipulation_og(show_manipulations);
 | 
			
		||||
    show_info_sizer(show_manipulations);
 | 
			
		||||
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
	no_updates.reset(nullptr);
 | 
			
		||||
| 
						 | 
				
			
			@ -1032,11 +1037,11 @@ wxMenuItem* menu_item_split(wxMenu* menu, int id) {
 | 
			
		|||
    return menu_item;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
wxMenuItem* menu_item_settings(wxMenu* menu, int id) {
 | 
			
		||||
wxMenuItem* menu_item_settings(wxMenu* menu, int id, const bool is_part) {
 | 
			
		||||
    auto  menu_item = new wxMenuItem(menu, id, _(L("Add settings")));
 | 
			
		||||
    menu_item->SetBitmap(m_bmp_cog);
 | 
			
		||||
 | 
			
		||||
    auto sub_menu = create_add_settings_popupmenu(false);
 | 
			
		||||
    auto sub_menu = create_add_settings_popupmenu(is_part);
 | 
			
		||||
    menu_item->SetSubMenu(sub_menu);
 | 
			
		||||
    return menu_item;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1063,7 +1068,7 @@ wxMenu *create_add_part_popupmenu()
 | 
			
		|||
 | 
			
		||||
    menu->AppendSeparator();
 | 
			
		||||
    // Append settings popupmenu
 | 
			
		||||
    menu->Append(menu_item_settings(menu, config_id_base + i + 1));
 | 
			
		||||
    menu->Append(menu_item_settings(menu, config_id_base + i + 1, false));
 | 
			
		||||
 | 
			
		||||
	wxWindow* win = get_tab_panel()->GetPage(0);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1099,7 +1104,7 @@ wxMenu *create_part_settings_popupmenu()
 | 
			
		|||
 | 
			
		||||
    menu->AppendSeparator();
 | 
			
		||||
    // Append settings popupmenu
 | 
			
		||||
    menu->Append(menu_item_settings(menu, config_id_base + 1));
 | 
			
		||||
    menu->Append(menu_item_settings(menu, config_id_base + 1, true));
 | 
			
		||||
 | 
			
		||||
    menu->Bind(wxEVT_MENU, [config_id_base, menu](wxEvent &event){
 | 
			
		||||
        switch (event.GetId() - config_id_base) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ class wxMenu;
 | 
			
		|||
class wxDataViewEvent;
 | 
			
		||||
class wxKeyEvent;
 | 
			
		||||
class wxGLCanvas;
 | 
			
		||||
class wxBitmap;
 | 
			
		||||
 | 
			
		||||
namespace Slic3r {
 | 
			
		||||
class ModelObject;
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +46,9 @@ struct OBJECT_PARAMETERS
 | 
			
		|||
	double			slab_z = 0.0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef std::map<std::string, wxBitmap> t_category_icon;
 | 
			
		||||
inline t_category_icon& get_category_icon();
 | 
			
		||||
 | 
			
		||||
void add_collapsible_panes(wxWindow* parent, wxBoxSizer* sizer);
 | 
			
		||||
void add_objects_list(wxWindow* parent, wxBoxSizer* sizer);
 | 
			
		||||
void add_object_settings(wxWindow* parent, wxBoxSizer* sizer);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@
 | 
			
		|||
 | 
			
		||||
#include "GUI.hpp"
 | 
			
		||||
#include "../../libslic3r/Utils.hpp"
 | 
			
		||||
#include "BitmapCache.hpp"
 | 
			
		||||
 | 
			
		||||
#include <wx/sizer.h>
 | 
			
		||||
#include <wx/statline.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -361,11 +362,52 @@ void PrusaObjectDataViewModelNode::set_settings_list_icon(const wxIcon& icon) {
 | 
			
		|||
    m_icon = icon;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Slic3r::GUI::BitmapCache *m_bitmap_cache = nullptr;
 | 
			
		||||
bool PrusaObjectDataViewModelNode::update_settings_digest(const std::vector<std::string>& categories)
 | 
			
		||||
{
 | 
			
		||||
    if (m_type != "settings" || m_opt_categories == categories)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    m_opt_categories = categories;
 | 
			
		||||
    m_name = wxEmptyString;
 | 
			
		||||
    m_icon = m_empty_icon;
 | 
			
		||||
 | 
			
		||||
    auto categories_icon = Slic3r::GUI::get_category_icon();
 | 
			
		||||
 | 
			
		||||
    for (auto& cat : m_opt_categories)
 | 
			
		||||
        m_name += cat + "; ";
 | 
			
		||||
 | 
			
		||||
    wxBitmap *bmp = m_bitmap_cache->find(m_name.ToStdString());
 | 
			
		||||
    if (bmp == nullptr) {
 | 
			
		||||
        std::vector<wxBitmap> bmps;
 | 
			
		||||
        for (auto& cat : m_opt_categories)
 | 
			
		||||
            bmps.emplace_back(categories_icon.find(cat) == categories_icon.end() ?
 | 
			
		||||
                              wxNullBitmap : categories_icon.at(cat));
 | 
			
		||||
        bmp = m_bitmap_cache->insert(m_name.ToStdString(), bmps);
 | 
			
		||||
    }
 | 
			
		||||
    m_icon.CopyFromBitmap(*bmp);
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// *****************************************************************************
 | 
			
		||||
// ----------------------------------------------------------------------------
 | 
			
		||||
// PrusaObjectDataViewModel
 | 
			
		||||
// ----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
PrusaObjectDataViewModel::PrusaObjectDataViewModel()
 | 
			
		||||
{
 | 
			
		||||
    m_bitmap_cache = new Slic3r::GUI::BitmapCache;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PrusaObjectDataViewModel::~PrusaObjectDataViewModel()
 | 
			
		||||
{
 | 
			
		||||
    for (auto object : m_objects)
 | 
			
		||||
			delete object;
 | 
			
		||||
    delete m_bitmap_cache;
 | 
			
		||||
    m_bitmap_cache = nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
wxDataViewItem PrusaObjectDataViewModel::Add(const wxString &name)
 | 
			
		||||
{
 | 
			
		||||
	auto root = new PrusaObjectDataViewModelNode(name);
 | 
			
		||||
| 
						 | 
				
			
			@ -792,6 +834,18 @@ bool PrusaObjectDataViewModel::IsSettingsItem(const wxDataViewItem &item) const
 | 
			
		|||
    return node->m_type == "settings";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void PrusaObjectDataViewModel::UpdateSettingsDigest(const wxDataViewItem &item, 
 | 
			
		||||
                                                    const std::vector<std::string>& categories)
 | 
			
		||||
{
 | 
			
		||||
    if (!item.IsOk()) return;
 | 
			
		||||
    PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID();
 | 
			
		||||
    if (!node->update_settings_digest(categories))
 | 
			
		||||
        return;
 | 
			
		||||
    ItemChanged(item);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ----------------------------------------------------------------------------
 | 
			
		||||
// PrusaDoubleSlider
 | 
			
		||||
// ----------------------------------------------------------------------------
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -155,7 +155,8 @@ class PrusaObjectDataViewModelNode
 | 
			
		|||
{
 | 
			
		||||
	PrusaObjectDataViewModelNode*	m_parent;
 | 
			
		||||
	MyObjectTreeModelNodePtrArray   m_children;
 | 
			
		||||
    wxIcon                          m_empty_icon; 
 | 
			
		||||
    wxIcon                          m_empty_icon;
 | 
			
		||||
    std::vector< std::string >      m_opt_categories;
 | 
			
		||||
public:
 | 
			
		||||
	PrusaObjectDataViewModelNode(const wxString &name, const int instances_count=1) {
 | 
			
		||||
		m_parent	= NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -340,6 +341,7 @@ public:
 | 
			
		|||
	void set_object_action_icon();
 | 
			
		||||
	void set_part_action_icon();
 | 
			
		||||
    void set_settings_list_icon(const wxIcon& icon);
 | 
			
		||||
    bool update_settings_digest(const std::vector<std::string>& categories);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// ----------------------------------------------------------------------------
 | 
			
		||||
| 
						 | 
				
			
			@ -350,12 +352,8 @@ class PrusaObjectDataViewModel :public wxDataViewModel
 | 
			
		|||
{
 | 
			
		||||
	std::vector<PrusaObjectDataViewModelNode*> m_objects;
 | 
			
		||||
public:
 | 
			
		||||
	PrusaObjectDataViewModel(){}
 | 
			
		||||
	~PrusaObjectDataViewModel()
 | 
			
		||||
	{
 | 
			
		||||
		for (auto object : m_objects)
 | 
			
		||||
			delete object;		
 | 
			
		||||
	}
 | 
			
		||||
    PrusaObjectDataViewModel();
 | 
			
		||||
    ~PrusaObjectDataViewModel();
 | 
			
		||||
 | 
			
		||||
	wxDataViewItem Add(const wxString &name);
 | 
			
		||||
	wxDataViewItem Add(const wxString &name, const int instances_count);
 | 
			
		||||
| 
						 | 
				
			
			@ -411,6 +409,7 @@ public:
 | 
			
		|||
 | 
			
		||||
    wxDataViewItem    HasSettings(const wxDataViewItem &item) const;
 | 
			
		||||
    bool    IsSettingsItem(const wxDataViewItem &item) const;
 | 
			
		||||
    void    UpdateSettingsDigest(const wxDataViewItem &item, const std::vector<std::string>& categories);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue