mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 12:41:20 -06:00 
			
		
		
		
	Added lock icons to system presets in ComboBoxes.
Added right event handling if informative string is selected in ComboBoxes
This commit is contained in:
		
							parent
							
								
									f38f0edaaf
								
							
						
					
					
						commit
						7083f58326
					
				
					 5 changed files with 106 additions and 48 deletions
				
			
		|  | @ -2,6 +2,7 @@ | |||
| #include <cassert> | ||||
| 
 | ||||
| #include "Preset.hpp" | ||||
| #include "BitmapCache.hpp" | ||||
| 
 | ||||
| #include <fstream> | ||||
| #include <boost/filesystem.hpp> | ||||
|  | @ -252,7 +253,8 @@ PresetCollection::PresetCollection(Preset::Type type, const std::vector<std::str | |||
|     m_type(type), | ||||
|     m_edited_preset(type, "", false), | ||||
|     m_idx_selected(0), | ||||
|     m_bitmap_main_frame(new wxBitmap) | ||||
|     m_bitmap_main_frame(new wxBitmap), | ||||
| 	m_bitmap_cache(new GUI::BitmapCache) | ||||
| { | ||||
|     // Insert just the default preset.
 | ||||
|     m_presets.emplace_back(Preset(type, "- default -", true)); | ||||
|  | @ -264,6 +266,8 @@ PresetCollection::~PresetCollection() | |||
| { | ||||
|     delete m_bitmap_main_frame; | ||||
|     m_bitmap_main_frame = nullptr; | ||||
| 	delete m_bitmap_cache; | ||||
| 	m_bitmap_cache = nullptr; | ||||
| } | ||||
| 
 | ||||
| void PresetCollection::reset(bool delete_files) | ||||
|  | @ -511,17 +515,41 @@ void PresetCollection::update_platter_ui(wxBitmapComboBox *ui) | |||
|     // Otherwise fill in the list from scratch.
 | ||||
|     ui->Freeze(); | ||||
|     ui->Clear(); | ||||
| 	std::map<wxString, bool> nonsys_presets; | ||||
| 
 | ||||
| 	const Preset &selected_preset = this->get_selected_preset(); | ||||
| 	// Show wide icons if the currently selected preset is not compatible with the current printer,
 | ||||
| 	// and draw a red flag in front of the selected preset.
 | ||||
| 	bool wide_icons = !selected_preset.is_compatible && m_bitmap_incompatible != nullptr; | ||||
| 
 | ||||
| 	std::map<wxString, wxBitmap*> nonsys_presets; | ||||
| 	wxString selected = ""; | ||||
|     for (size_t i = this->m_presets.front().is_visible ? 0 : 1; i < this->m_presets.size(); ++ i) { | ||||
| 	if (!this->m_presets.front().is_visible) | ||||
| 		ui->Append("------- System presets -------", wxNullBitmap); | ||||
| 	for (size_t i = this->m_presets.front().is_visible ? 0 : 1; i < this->m_presets.size(); ++i) { | ||||
|         const Preset &preset = this->m_presets[i]; | ||||
|         if (! preset.is_visible || (! preset.is_compatible && i != m_idx_selected)) | ||||
|             continue; | ||||
|         const wxBitmap *bmp = (i == 0 || preset.is_compatible) ? m_bitmap_main_frame : m_bitmap_incompatible; | ||||
| //         ui->Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()),
 | ||||
| //             (bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *bmp);
 | ||||
| // 		if (i == m_idx_selected)
 | ||||
| //             ui->SetSelection(ui->GetCount() - 1);
 | ||||
| 		std::string   bitmap_key = ""; | ||||
| 		// If the filament preset is not compatible and there is a "red flag" icon loaded, show it left
 | ||||
| 		// to the filament color image.
 | ||||
| 		if (wide_icons) | ||||
| 			bitmap_key += preset.is_compatible ? ",cmpt" : ",ncmpt"; | ||||
| 		bitmap_key += (preset.is_system || preset.is_default) ? ",syst" : ",nsyst"; | ||||
| 		wxBitmap     *bmp = m_bitmap_cache->find(bitmap_key); | ||||
| 		if (bmp == nullptr) { | ||||
| 			// Create the bitmap with color bars.
 | ||||
| 			std::vector<wxBitmap> bmps; | ||||
| 			if (wide_icons) | ||||
| 				// Paint a red flag for incompatible presets.
 | ||||
| 				bmps.emplace_back(preset.is_compatible ? m_bitmap_cache->mkclear(16, 16) : *m_bitmap_incompatible); | ||||
| 			// Paint the color bars.
 | ||||
| 			bmps.emplace_back(m_bitmap_cache->mkclear(4, 16)); | ||||
| 			bmps.emplace_back(*m_bitmap_main_frame); | ||||
| 			// Paint a lock at the system presets.
 | ||||
|  			bmps.emplace_back(m_bitmap_cache->mkclear(6, 16)); | ||||
| 			bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(16, 16)); | ||||
| 			bmp = m_bitmap_cache->insert(bitmap_key, bmps); | ||||
| 		} | ||||
| 
 | ||||
| 		if (preset.is_default || preset.is_system){ | ||||
| 			ui->Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()), | ||||
|  | @ -531,20 +559,18 @@ void PresetCollection::update_platter_ui(wxBitmapComboBox *ui) | |||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			nonsys_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()), preset.is_compatible); | ||||
| 			nonsys_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()), bmp/*preset.is_compatible*/); | ||||
| 			if (i == m_idx_selected) | ||||
| 				selected = wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()); | ||||
| 		} | ||||
| 		if (preset.is_default) | ||||
| 			ui->Append("------------------------------------", wxNullBitmap); | ||||
| 			ui->Append("------- System presets -------", wxNullBitmap); | ||||
| 	} | ||||
| 	if (!nonsys_presets.empty()) | ||||
| 	{ | ||||
| 		ui->Append("------------------------------------", wxNullBitmap); | ||||
| 		for (std::map<wxString, bool>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { | ||||
| 			const wxBitmap *bmp = it->second ? m_bitmap_compatible : m_bitmap_incompatible; | ||||
| 			ui->Append(it->first, | ||||
| 				(bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *bmp); | ||||
| 		ui->Append("-------  User presets  -------", wxNullBitmap); | ||||
| 		for (std::map<wxString, wxBitmap*>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { | ||||
| 			ui->Append(it->first, *it->second); | ||||
| 			if (it->first == selected) | ||||
| 				ui->SetSelection(ui->GetCount() - 1); | ||||
| 		} | ||||
|  | @ -552,51 +578,63 @@ void PresetCollection::update_platter_ui(wxBitmapComboBox *ui) | |||
|     ui->Thaw(); | ||||
| } | ||||
| 
 | ||||
| void PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible) | ||||
| size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible) | ||||
| { | ||||
|     if (ui == nullptr) | ||||
|         return; | ||||
|         return 0; | ||||
|     ui->Freeze(); | ||||
|     ui->Clear(); | ||||
| 	std::map<wxString, bool> nonsys_presets; | ||||
| 	size_t selected_preset_item = 0; | ||||
| 
 | ||||
| 	std::map<wxString, wxBitmap*> nonsys_presets; | ||||
| 	wxString selected = ""; | ||||
|     for (size_t i = this->m_presets.front().is_visible ? 0 : 1; i < this->m_presets.size(); ++ i) { | ||||
| 	if (!this->m_presets.front().is_visible) | ||||
| 		ui->Append("------- System presets -------", wxNullBitmap); | ||||
| 	for (size_t i = this->m_presets.front().is_visible ? 0 : 1; i < this->m_presets.size(); ++i) { | ||||
|         const Preset &preset = this->m_presets[i]; | ||||
|         if (! preset.is_visible || (! show_incompatible && ! preset.is_compatible && i != m_idx_selected)) | ||||
|             continue; | ||||
|         const wxBitmap *bmp = preset.is_compatible ? m_bitmap_compatible : m_bitmap_incompatible; | ||||
| //         ui->Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()),
 | ||||
| //             (bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *bmp);
 | ||||
| // 		if (i == m_idx_selected)
 | ||||
| //             ui->SetSelection(ui->GetCount() - 1);
 | ||||
| 		std::string   bitmap_key = "tab"; | ||||
| 		bitmap_key += preset.is_compatible ? ",cmpt" : ",ncmpt"; | ||||
| 		bitmap_key += (preset.is_system || preset.is_default) ? ",syst" : ",nsyst"; | ||||
| 		wxBitmap     *bmp = m_bitmap_cache->find(bitmap_key); | ||||
| 		if (bmp == nullptr) { | ||||
| 			// Create the bitmap with color bars.
 | ||||
| 			std::vector<wxBitmap> bmps; | ||||
| 			const wxBitmap* tmp_bmp = preset.is_compatible ? m_bitmap_compatible : m_bitmap_incompatible; | ||||
| 			bmps.emplace_back((tmp_bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *tmp_bmp); | ||||
| 			// Paint a lock at the system presets.
 | ||||
| 			bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(16, 16)); | ||||
| 			bmp = m_bitmap_cache->insert(bitmap_key, bmps); | ||||
| 		} | ||||
| 
 | ||||
| 		if (preset.is_default || preset.is_system){ | ||||
| 			ui->Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()), | ||||
| 				(bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *bmp); | ||||
| 			if (i == m_idx_selected) | ||||
| 				ui->SetSelection(ui->GetCount() - 1); | ||||
| 				selected_preset_item = ui->GetCount() - 1; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			nonsys_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()), preset.is_compatible); | ||||
| 			nonsys_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()), bmp/*preset.is_compatible*/); | ||||
| 			if (i == m_idx_selected) | ||||
| 				selected = wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()); | ||||
| 		} | ||||
| 		if (preset.is_default) | ||||
| 			ui->Append("------------------------------------", wxNullBitmap); | ||||
| 			ui->Append("------- System presets -------", wxNullBitmap); | ||||
|     } | ||||
| 	if (!nonsys_presets.empty()) | ||||
| 	{ | ||||
| 		ui->Append("------------------------------------", wxNullBitmap); | ||||
| 		for (std::map<wxString, bool>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { | ||||
| 			const wxBitmap *bmp = it->second ? m_bitmap_compatible : m_bitmap_incompatible; | ||||
| 			ui->Append(it->first, | ||||
| 				(bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *bmp); | ||||
| 		ui->Append("-------  User presets  -------", wxNullBitmap); | ||||
| 		for (std::map<wxString, wxBitmap*>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { | ||||
| 			ui->Append(it->first, *it->second); | ||||
| 			if (it->first == selected) | ||||
| 				ui->SetSelection(ui->GetCount() - 1); | ||||
| 				selected_preset_item = ui->GetCount() - 1; | ||||
| 		} | ||||
| 	} | ||||
| 	ui->SetSelection(selected_preset_item); | ||||
|     ui->Thaw(); | ||||
| 	return selected_preset_item; | ||||
| } | ||||
| 
 | ||||
| // Update a dirty floag of the current preset, update the labels of the UI component accordingly.
 | ||||
|  | @ -692,6 +730,11 @@ bool PresetCollection::select_preset_by_name(const std::string &name_w_suffix, b | |||
|         // If the first visible preset was not found, return the 0th element, which is the default preset.
 | ||||
|     } | ||||
| 
 | ||||
| 	// Temporary decision
 | ||||
| 	if (name_w_suffix == "------- System presets -------" || | ||||
| 		name_w_suffix == "-------  User presets  -------") | ||||
| 		return true; | ||||
| 
 | ||||
|     // 2) Select the new preset.
 | ||||
|     if (m_idx_selected != idx || force) { | ||||
|         this->select_preset(idx); | ||||
|  |  | |||
|  | @ -13,6 +13,10 @@ class wxItemContainer; | |||
| 
 | ||||
| namespace Slic3r { | ||||
| 
 | ||||
| namespace GUI { | ||||
| 	class BitmapCache; | ||||
| } | ||||
| 
 | ||||
| enum ConfigFileType | ||||
| { | ||||
|     CONFIG_FILE_TYPE_UNKNOWN, | ||||
|  | @ -264,7 +268,7 @@ public: | |||
|     // Update the choice UI from the list of presets.
 | ||||
|     // If show_incompatible, all presets are shown, otherwise only the compatible presets are shown.
 | ||||
|     // If an incompatible preset is selected, it is shown as well.
 | ||||
|     void            update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible); | ||||
|     size_t          update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible); | ||||
|     // Update the choice UI from the list of presets.
 | ||||
|     // Only the compatible presets are shown.
 | ||||
|     // If an incompatible preset is selected, it is shown as well.
 | ||||
|  | @ -324,6 +328,8 @@ private: | |||
|     wxBitmap               *m_bitmap_main_frame; | ||||
|     // Path to the directory to store the config files into.
 | ||||
|     std::string             m_dir_path; | ||||
| 	// Caching color bitmaps for the filament combo box.
 | ||||
| 	GUI::BitmapCache       *m_bitmap_cache = nullptr; | ||||
| }; | ||||
| 
 | ||||
| } // namespace Slic3r
 | ||||
|  |  | |||
|  | @ -1025,9 +1025,11 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, wxBitma | |||
|     // and draw a red flag in front of the selected preset.
 | ||||
|     bool          wide_icons      = selected_preset != nullptr && ! selected_preset->is_compatible && m_bitmapIncompatible != nullptr; | ||||
|     assert(selected_preset != nullptr); | ||||
| 	std::map<wxString, wxBitmap> nonsys_presets; | ||||
| 	std::map<wxString, wxBitmap*> nonsys_presets; | ||||
| 	wxString selected_str = ""; | ||||
|     for (int i = this->filaments().front().is_visible ? 0 : 1; i < int(this->filaments().size()); ++ i) { | ||||
| 	if (!this->filaments().front().is_visible) | ||||
| 		ui->Append("------- System presets -------", wxNullBitmap); | ||||
| 	for (int i = this->filaments().front().is_visible ? 0 : 1; i < int(this->filaments().size()); ++i) { | ||||
|         const Preset &preset    = this->filaments.preset(i); | ||||
|         bool          selected  = this->filament_presets[idx_extruder] == preset.name; | ||||
| 		if (! preset.is_visible || (! preset.is_compatible && ! selected)) | ||||
|  | @ -1059,14 +1061,11 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, wxBitma | |||
|                 bmps.emplace_back(m_bitmapCache->mksolid(8,  16, rgb)); | ||||
|             } | ||||
|             // Paint a lock at the system presets.
 | ||||
|             bmps.emplace_back(m_bitmapCache->mkclear(4, 16)); | ||||
|             bmps.emplace_back((preset.is_system || preset.is_default) ?  | ||||
|                 (preset.is_dirty ? *m_bitmapLockOpen : *m_bitmapLock) : m_bitmapCache->mkclear(16, 16)); | ||||
|             bmps.emplace_back(m_bitmapCache->mkclear(2, 16)); | ||||
| 			bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmapLock : m_bitmapCache->mkclear(16, 16)); | ||||
| //                 (preset.is_dirty ? *m_bitmapLockOpen : *m_bitmapLock) : m_bitmapCache->mkclear(16, 16));
 | ||||
|             bitmap = m_bitmapCache->insert(bitmap_key, bmps); | ||||
| 		} | ||||
| // 		ui->Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), (bitmap == 0) ? wxNullBitmap : *bitmap);
 | ||||
| //         if (selected)
 | ||||
| //             ui->SetSelection(ui->GetCount() - 1);
 | ||||
| 
 | ||||
| 		if (preset.is_default || preset.is_system){ | ||||
| 			ui->Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()),  | ||||
|  | @ -1077,19 +1076,19 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, wxBitma | |||
| 		else | ||||
| 		{ | ||||
| 			nonsys_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()),  | ||||
| 				(bitmap == 0) ? wxNullBitmap : *bitmap); | ||||
| 				(bitmap == 0) ? &wxNullBitmap : bitmap); | ||||
| 			if (selected) | ||||
| 				selected_str = wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()); | ||||
| 		} | ||||
| 		if (preset.is_default) | ||||
| 			ui->Append("------------------------------------", wxNullBitmap); | ||||
| 			ui->Append("------- System presets -------", wxNullBitmap); | ||||
|     } | ||||
| 
 | ||||
| 	if (!nonsys_presets.empty()) | ||||
| 	{ | ||||
| 		ui->Append("------------------------------------", wxNullBitmap); | ||||
| 		for (std::map<wxString, wxBitmap>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { | ||||
| 			ui->Append(it->first, it->second); | ||||
| 		ui->Append("-------  User presets  -------", wxNullBitmap); | ||||
| 		for (std::map<wxString, wxBitmap*>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { | ||||
| 			ui->Append(it->first, *it->second); | ||||
| 			if (it->first == selected_str) | ||||
| 				ui->SetSelection(ui->GetCount() - 1); | ||||
| 		} | ||||
|  |  | |||
|  | @ -198,8 +198,16 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle) | |||
| 		//! select_preset(m_presets_choice->GetStringSelection().ToStdString()); 
 | ||||
| 		//! we doing next:
 | ||||
| 		int selected_item = m_presets_choice->GetSelection(); | ||||
| 		if (m_selected_preset_item == selected_item) | ||||
| 			return; | ||||
| 		if (selected_item >= 0){ | ||||
| 			std::string selected_string = m_presets_choice->GetString(selected_item).ToUTF8().data(); | ||||
| 			if (selected_string == "------- System presets -------" || | ||||
| 				selected_string == "-------  User presets  -------"){ | ||||
| 				m_presets_choice->SetSelection(m_selected_preset_item); | ||||
| 				return; | ||||
| 			} | ||||
| 			m_selected_preset_item = selected_item; | ||||
| 			select_preset(selected_string); | ||||
| 		} | ||||
| 	})); | ||||
|  | @ -488,7 +496,7 @@ void Tab::update_dirty(){ | |||
| 
 | ||||
| void Tab::update_tab_ui() | ||||
| { | ||||
| 	m_presets->update_tab_ui(m_presets_choice, m_show_incompatible_presets); | ||||
| 	m_selected_preset_item = m_presets->update_tab_ui(m_presets_choice, m_show_incompatible_presets); | ||||
| // 	update_tab_presets(m_cc_presets_choice, m_show_incompatible_presets);
 | ||||
| // 	update_presetsctrl(m_presetctrl, m_show_incompatible_presets);
 | ||||
| } | ||||
|  |  | |||
|  | @ -154,6 +154,8 @@ protected: | |||
| 	bool				m_is_nonsys_values{ true }; | ||||
| 	bool				m_postpone_update_ui {false}; | ||||
| 
 | ||||
| 	size_t				m_selected_preset_item{ 0 }; | ||||
| 
 | ||||
| public: | ||||
| 	PresetBundle*		m_preset_bundle; | ||||
| 	bool				m_show_btn_incompatible_presets = false; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 YuSanka
						YuSanka