mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	ObjectDataViewModel is extracted from wxExtentions to the separated file
+ parse_color function is moved to BitmapCache from PresetBundle
This commit is contained in:
		
							parent
							
								
									eb6e0c06e4
								
							
						
					
					
						commit
						3f7ebee396
					
				
					 12 changed files with 2325 additions and 2398 deletions
				
			
		|  | @ -147,6 +147,8 @@ set(SLIC3R_GUI_SOURCES | |||
|     GUI/Mouse3DController.hpp | ||||
|     GUI/DoubleSlider.cpp | ||||
|     GUI/DoubleSlider.hpp | ||||
|     GUI/ObjectDataViewModel.cpp | ||||
|     GUI/ObjectDataViewModel.hpp | ||||
|     Utils/Http.cpp | ||||
|     Utils/Http.hpp | ||||
|     Utils/FixModelByWin10.cpp | ||||
|  |  | |||
|  | @ -10,7 +10,7 @@ | |||
| #include "libslic3r/SLAPrint.hpp" | ||||
| #include "libslic3r/Slicing.hpp" | ||||
| #include "libslic3r/GCode/Analyzer.hpp" | ||||
| #include "slic3r/GUI/PresetBundle.hpp" | ||||
| #include "slic3r/GUI/BitmapCache.hpp" | ||||
| #include "libslic3r/Format/STL.hpp" | ||||
| #include "libslic3r/Utils.hpp" | ||||
| 
 | ||||
|  | @ -792,14 +792,14 @@ void GLVolumeCollection::update_colors_by_extruder(const DynamicPrintConfig* con | |||
|     for (unsigned int i = 0; i < colors_count; ++i) | ||||
|     { | ||||
|         const std::string& txt_color = config->opt_string("extruder_colour", i); | ||||
|         if (PresetBundle::parse_color(txt_color, rgb)) | ||||
|         if (Slic3r::GUI::BitmapCache::parse_color(txt_color, rgb)) | ||||
|         { | ||||
|             colors[i].set(txt_color, rgb); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             const std::string& txt_color = config->opt_string("filament_colour", i); | ||||
|             if (PresetBundle::parse_color(txt_color, rgb)) | ||||
|             if (Slic3r::GUI::BitmapCache::parse_color(txt_color, rgb)) | ||||
|                 colors[i].set(txt_color, rgb); | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -2,6 +2,8 @@ | |||
| 
 | ||||
| #include "libslic3r/Utils.hpp" | ||||
| #include "../Utils/MacDarkMode.hpp" | ||||
| #include "GUI.hpp" | ||||
| 
 | ||||
| #include <boost/filesystem.hpp> | ||||
| 
 | ||||
| #if ! defined(WIN32) && ! defined(__APPLE__) | ||||
|  | @ -349,5 +351,30 @@ wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsi | |||
|     return wxImage_to_wxBitmap_with_alpha(std::move(image), scale); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static inline int hex_digit_to_int(const char c) | ||||
| { | ||||
|     return | ||||
|         (c >= '0' && c <= '9') ? int(c - '0') : | ||||
|         (c >= 'A' && c <= 'F') ? int(c - 'A') + 10 : | ||||
|         (c >= 'a' && c <= 'f') ? int(c - 'a') + 10 : -1; | ||||
| } | ||||
| 
 | ||||
| bool BitmapCache::parse_color(const std::string& scolor, unsigned char* rgb_out) | ||||
| { | ||||
|     rgb_out[0] = rgb_out[1] = rgb_out[2] = 0; | ||||
|     if (scolor.size() != 7 || scolor.front() != '#') | ||||
|         return false; | ||||
|     const char* c = scolor.data() + 1; | ||||
|     for (size_t i = 0; i < 3; ++i) { | ||||
|         int digit1 = hex_digit_to_int(*c++); | ||||
|         int digit2 = hex_digit_to_int(*c++); | ||||
|         if (digit1 == -1 || digit2 == -1) | ||||
|             return false; | ||||
|         rgb_out[i] = (unsigned char)(digit1 * 16 + digit2); | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| } // namespace GUI
 | ||||
| } // namespace Slic3r
 | ||||
|  |  | |||
|  | @ -6,11 +6,6 @@ | |||
|     #include <wx/wx.h> | ||||
| #endif | ||||
| 
 | ||||
| #include "libslic3r/libslic3r.h" | ||||
| #include "libslic3r/Config.hpp" | ||||
| 
 | ||||
| #include "GUI.hpp" | ||||
| 
 | ||||
| namespace Slic3r { namespace GUI { | ||||
| 
 | ||||
| class BitmapCache | ||||
|  | @ -41,6 +36,8 @@ public: | |||
| 	/*static */wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE); } | ||||
| 	/*static */wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT); } | ||||
| 
 | ||||
| 	static bool                 parse_color(const std::string& scolor, unsigned char* rgb_out); | ||||
| 
 | ||||
| private: | ||||
|     std::map<std::string, wxBitmap*>	m_map; | ||||
|     double	m_gs	= 0.2;	// value, used for image.ConvertToGreyscale(m_gs, m_gs, m_gs)
 | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ | |||
| 
 | ||||
| #include "Event.hpp" | ||||
| #include "wxExtensions.hpp" | ||||
| #include "ObjectDataViewModel.hpp" | ||||
| 
 | ||||
| class wxBoxSizer; | ||||
| class wxBitmapComboBox; | ||||
|  |  | |||
							
								
								
									
										1764
									
								
								src/slic3r/GUI/ObjectDataViewModel.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1764
									
								
								src/slic3r/GUI/ObjectDataViewModel.cpp
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										516
									
								
								src/slic3r/GUI/ObjectDataViewModel.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										516
									
								
								src/slic3r/GUI/ObjectDataViewModel.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,516 @@ | |||
| #ifndef slic3r_GUI_ObjectDataViewModel_hpp_ | ||||
| #define slic3r_GUI_ObjectDataViewModel_hpp_ | ||||
| 
 | ||||
| #include <wx/dataview.h> | ||||
| 
 | ||||
| #include <vector> | ||||
| 
 | ||||
| namespace Slic3r { | ||||
| 
 | ||||
| enum class ModelVolumeType : int; | ||||
| 
 | ||||
| namespace GUI { | ||||
| 
 | ||||
| typedef double                          coordf_t; | ||||
| typedef std::pair<coordf_t, coordf_t>   t_layer_height_range; | ||||
| 
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| // DataViewBitmapText: helper class used by BitmapTextRenderer
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| 
 | ||||
| class DataViewBitmapText : public wxObject | ||||
| { | ||||
| public: | ||||
|     DataViewBitmapText( const wxString &text = wxEmptyString, | ||||
|                         const wxBitmap& bmp = wxNullBitmap) : | ||||
|         m_text(text), | ||||
|         m_bmp(bmp) | ||||
|     { } | ||||
| 
 | ||||
|     DataViewBitmapText(const DataViewBitmapText &other) | ||||
|         : wxObject(), | ||||
|         m_text(other.m_text), | ||||
|         m_bmp(other.m_bmp) | ||||
|     { } | ||||
| 
 | ||||
|     void SetText(const wxString &text)      { m_text = text; } | ||||
|     wxString GetText() const                { return m_text; } | ||||
|     void SetBitmap(const wxBitmap &bmp)     { m_bmp = bmp; } | ||||
|     const wxBitmap &GetBitmap() const       { return m_bmp; } | ||||
| 
 | ||||
|     bool IsSameAs(const DataViewBitmapText& other) const { | ||||
|         return m_text == other.m_text && m_bmp.IsSameAs(other.m_bmp); | ||||
|     } | ||||
| 
 | ||||
|     bool operator==(const DataViewBitmapText& other) const { | ||||
|         return IsSameAs(other); | ||||
|     } | ||||
| 
 | ||||
|     bool operator!=(const DataViewBitmapText& other) const { | ||||
|         return !IsSameAs(other); | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     wxString    m_text; | ||||
|     wxBitmap    m_bmp; | ||||
| 
 | ||||
|     wxDECLARE_DYNAMIC_CLASS(DataViewBitmapText); | ||||
| }; | ||||
| DECLARE_VARIANT_OBJECT(DataViewBitmapText) | ||||
| 
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| // BitmapTextRenderer
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| #if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING | ||||
| class BitmapTextRenderer : public wxDataViewRenderer | ||||
| #else | ||||
| class BitmapTextRenderer : public wxDataViewCustomRenderer | ||||
| #endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
 | ||||
| { | ||||
| public: | ||||
|     BitmapTextRenderer(wxWindow* parent, | ||||
|         wxDataViewCellMode mode = | ||||
| #ifdef __WXOSX__ | ||||
|         wxDATAVIEW_CELL_INERT | ||||
| #else | ||||
|         wxDATAVIEW_CELL_EDITABLE | ||||
| #endif | ||||
| 
 | ||||
|         , int align = wxDVR_DEFAULT_ALIGNMENT | ||||
| #if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING | ||||
|     ); | ||||
| #else | ||||
|         ) : | ||||
|     wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align), | ||||
|         m_parent(parent) | ||||
|     {} | ||||
| #endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
 | ||||
| 
 | ||||
|     bool SetValue(const wxVariant& value); | ||||
|     bool GetValue(wxVariant& value) const; | ||||
| #if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING && wxUSE_ACCESSIBILITY | ||||
|     virtual wxString GetAccessibleDescription() const override; | ||||
| #endif // wxUSE_ACCESSIBILITY && ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
 | ||||
| 
 | ||||
|     virtual bool Render(wxRect cell, wxDC* dc, int state) override; | ||||
|     virtual wxSize GetSize() const override; | ||||
| 
 | ||||
|     bool        HasEditorCtrl() const override | ||||
|     { | ||||
| #ifdef __WXOSX__ | ||||
|         return false; | ||||
| #else | ||||
|         return true; | ||||
| #endif | ||||
|     } | ||||
|     wxWindow* CreateEditorCtrl(wxWindow* parent, | ||||
|         wxRect labelRect, | ||||
|         const wxVariant& value) override; | ||||
|     bool        GetValueFromEditorCtrl(wxWindow* ctrl, | ||||
|         wxVariant& value) override; | ||||
|     bool        WasCanceled() const { return m_was_unusable_symbol; } | ||||
| 
 | ||||
| private: | ||||
|     DataViewBitmapText  m_value; | ||||
|     bool                m_was_unusable_symbol{ false }; | ||||
|     wxWindow* m_parent{ nullptr }; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| // BitmapChoiceRenderer
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| 
 | ||||
| class BitmapChoiceRenderer : public wxDataViewCustomRenderer | ||||
| { | ||||
| public: | ||||
|     BitmapChoiceRenderer(wxDataViewCellMode mode = | ||||
| #ifdef __WXOSX__ | ||||
|         wxDATAVIEW_CELL_INERT | ||||
| #else | ||||
|         wxDATAVIEW_CELL_EDITABLE | ||||
| #endif | ||||
|         , int align = wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | ||||
|     ) : wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align) {} | ||||
| 
 | ||||
|     bool SetValue(const wxVariant& value); | ||||
|     bool GetValue(wxVariant& value) const; | ||||
| 
 | ||||
|     virtual bool Render(wxRect cell, wxDC* dc, int state) override; | ||||
|     virtual wxSize GetSize() const override; | ||||
| 
 | ||||
|     bool        HasEditorCtrl() const override { return true; } | ||||
|     wxWindow* CreateEditorCtrl(wxWindow* parent, | ||||
|         wxRect labelRect, | ||||
|         const wxVariant& value) override; | ||||
|     bool        GetValueFromEditorCtrl(wxWindow* ctrl, | ||||
|         wxVariant& value) override; | ||||
| 
 | ||||
| private: | ||||
|     DataViewBitmapText  m_value; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| // ObjectDataViewModelNode: a node inside ObjectDataViewModel
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| enum ItemType { | ||||
|     itUndef         = 0, | ||||
|     itObject        = 1, | ||||
|     itVolume        = 2, | ||||
|     itInstanceRoot  = 4, | ||||
|     itInstance      = 8, | ||||
|     itSettings      = 16, | ||||
|     itLayerRoot     = 32, | ||||
|     itLayer         = 64, | ||||
| }; | ||||
| 
 | ||||
| enum ColumnNumber | ||||
| { | ||||
|     colName         = 0,    // item name
 | ||||
|     colPrint           ,    // printable property
 | ||||
|     colExtruder        ,    // extruder selection
 | ||||
|     colEditing         ,    // item editing
 | ||||
| }; | ||||
| 
 | ||||
| enum PrintIndicator | ||||
| { | ||||
|     piUndef         = 0,    // no print indicator
 | ||||
|     piPrintable        ,    // printable
 | ||||
|     piUnprintable      ,    // unprintable
 | ||||
| }; | ||||
| 
 | ||||
| class ObjectDataViewModelNode; | ||||
| WX_DEFINE_ARRAY_PTR(ObjectDataViewModelNode*, MyObjectTreeModelNodePtrArray); | ||||
| 
 | ||||
| class ObjectDataViewModelNode | ||||
| { | ||||
|     ObjectDataViewModelNode*	    m_parent; | ||||
|     MyObjectTreeModelNodePtrArray   m_children; | ||||
|     wxBitmap                        m_empty_bmp; | ||||
|     size_t                          m_volumes_cnt = 0; | ||||
|     std::vector< std::string >      m_opt_categories; | ||||
|     t_layer_height_range            m_layer_range = { 0.0f, 0.0f }; | ||||
| 
 | ||||
|     wxString				        m_name; | ||||
|     wxBitmap&                       m_bmp = m_empty_bmp; | ||||
|     ItemType				        m_type; | ||||
|     int                             m_idx = -1; | ||||
|     bool					        m_container = false; | ||||
|     wxString				        m_extruder = "default"; | ||||
|     wxBitmap                        m_extruder_bmp; | ||||
|     wxBitmap				        m_action_icon; | ||||
|     PrintIndicator                  m_printable {piUndef}; | ||||
|     wxBitmap				        m_printable_icon; | ||||
| 
 | ||||
|     std::string                     m_action_icon_name = ""; | ||||
|     ModelVolumeType                 m_volume_type; | ||||
| 
 | ||||
| public: | ||||
|     ObjectDataViewModelNode(const wxString& name, | ||||
|                             const wxString& extruder): | ||||
|         m_parent(NULL), | ||||
|         m_name(name), | ||||
|         m_type(itObject), | ||||
|         m_extruder(extruder) | ||||
|     { | ||||
|         set_action_and_extruder_icons(); | ||||
|         init_container(); | ||||
| 	} | ||||
| 
 | ||||
|     ObjectDataViewModelNode(ObjectDataViewModelNode* parent, | ||||
|                             const wxString& sub_obj_name, | ||||
|                             const wxBitmap& bmp, | ||||
|                             const wxString& extruder, | ||||
|                             const int idx = -1 ) : | ||||
|         m_parent	(parent), | ||||
|         m_name		(sub_obj_name), | ||||
|         m_type		(itVolume), | ||||
|         m_idx       (idx), | ||||
|         m_extruder  (extruder) | ||||
|     { | ||||
|         m_bmp = bmp; | ||||
|         set_action_and_extruder_icons(); | ||||
|         init_container(); | ||||
|     } | ||||
| 
 | ||||
|     ObjectDataViewModelNode(ObjectDataViewModelNode* parent, | ||||
|                             const t_layer_height_range& layer_range, | ||||
|                             const int idx = -1, | ||||
|                             const wxString& extruder = wxEmptyString ); | ||||
| 
 | ||||
|     ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const ItemType type); | ||||
| 
 | ||||
|     ~ObjectDataViewModelNode() | ||||
|     { | ||||
|         // free all our children nodes
 | ||||
|         size_t count = m_children.GetCount(); | ||||
|         for (size_t i = 0; i < count; i++) | ||||
|         { | ||||
|             ObjectDataViewModelNode *child = m_children[i]; | ||||
|             delete child; | ||||
|         } | ||||
| #ifndef NDEBUG | ||||
|         // Indicate that the object was deleted.
 | ||||
|         m_idx = -2; | ||||
| #endif /* NDEBUG */ | ||||
|     } | ||||
| 
 | ||||
| 	void init_container(); | ||||
| 	bool IsContainer() const | ||||
| 	{ | ||||
| 		return m_container; | ||||
| 	} | ||||
| 
 | ||||
|     ObjectDataViewModelNode* GetParent() | ||||
|     { | ||||
|         assert(m_parent == nullptr || m_parent->valid()); | ||||
|         return m_parent; | ||||
|     } | ||||
|     MyObjectTreeModelNodePtrArray& GetChildren() | ||||
|     { | ||||
|         return m_children; | ||||
|     } | ||||
|     ObjectDataViewModelNode* GetNthChild(unsigned int n) | ||||
|     { | ||||
|         return m_children.Item(n); | ||||
|     } | ||||
|     void Insert(ObjectDataViewModelNode* child, unsigned int n) | ||||
|     { | ||||
|         if (!m_container) | ||||
|             m_container = true; | ||||
|         m_children.Insert(child, n); | ||||
|     } | ||||
|     void Append(ObjectDataViewModelNode* child) | ||||
|     { | ||||
|         if (!m_container) | ||||
|             m_container = true; | ||||
|         m_children.Add(child); | ||||
|     } | ||||
|     void RemoveAllChildren() | ||||
|     { | ||||
|         if (GetChildCount() == 0) | ||||
|             return; | ||||
|         for (int id = int(GetChildCount()) - 1; id >= 0; --id) | ||||
|         { | ||||
|             if (m_children.Item(id)->GetChildCount() > 0) | ||||
|                 m_children[id]->RemoveAllChildren(); | ||||
|             auto node = m_children[id]; | ||||
|             m_children.RemoveAt(id); | ||||
|             delete node; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     size_t GetChildCount() const | ||||
|     { | ||||
|         return m_children.GetCount(); | ||||
|     } | ||||
| 
 | ||||
|     bool            SetValue(const wxVariant &variant, unsigned int col); | ||||
| 
 | ||||
|     void            SetBitmap(const wxBitmap &icon) { m_bmp = icon; } | ||||
|     const wxBitmap& GetBitmap() const               { return m_bmp; } | ||||
|     const wxString& GetName() const                 { return m_name; } | ||||
|     ItemType        GetType() const                 { return m_type; } | ||||
| 	void			SetIdx(const int& idx); | ||||
| 	int             GetIdx() const                  { return m_idx; } | ||||
| 	t_layer_height_range    GetLayerRange() const   { return m_layer_range; } | ||||
|     PrintIndicator  IsPrintable() const             { return m_printable; } | ||||
| 
 | ||||
|     // use this function only for childrens
 | ||||
|     void AssignAllVal(ObjectDataViewModelNode& from_node) | ||||
|     { | ||||
|         // ! Don't overwrite other values because of equality of this values for all children --
 | ||||
|         m_name = from_node.m_name; | ||||
|         m_bmp = from_node.m_bmp; | ||||
|         m_idx = from_node.m_idx; | ||||
|         m_extruder = from_node.m_extruder; | ||||
|         m_type = from_node.m_type; | ||||
|     } | ||||
| 
 | ||||
|     bool SwapChildrens(int frst_id, int scnd_id) { | ||||
|         if (GetChildCount() < 2 || | ||||
|             frst_id < 0 || (size_t)frst_id >= GetChildCount() || | ||||
|             scnd_id < 0 || (size_t)scnd_id >= GetChildCount()) | ||||
|             return false; | ||||
| 
 | ||||
|         ObjectDataViewModelNode new_scnd = *GetNthChild(frst_id); | ||||
|         ObjectDataViewModelNode new_frst = *GetNthChild(scnd_id); | ||||
| 
 | ||||
|         new_scnd.m_idx = m_children.Item(scnd_id)->m_idx; | ||||
|         new_frst.m_idx = m_children.Item(frst_id)->m_idx; | ||||
| 
 | ||||
|         m_children.Item(frst_id)->AssignAllVal(new_frst); | ||||
|         m_children.Item(scnd_id)->AssignAllVal(new_scnd); | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     // Set action icons for node
 | ||||
|     void        set_action_and_extruder_icons(); | ||||
| 	// Set printable icon for node
 | ||||
|     void        set_printable_icon(PrintIndicator printable); | ||||
| 
 | ||||
|     void        update_settings_digest_bitmaps(); | ||||
|     bool        update_settings_digest(const std::vector<std::string>& categories); | ||||
|     int         volume_type() const { return int(m_volume_type); } | ||||
|     void        msw_rescale(); | ||||
| 
 | ||||
| #ifndef NDEBUG | ||||
|     bool 		valid(); | ||||
| #endif /* NDEBUG */ | ||||
|     bool        invalid() const { return m_idx < -1; } | ||||
| 
 | ||||
| private: | ||||
|     friend class ObjectDataViewModel; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| // ObjectDataViewModel
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| 
 | ||||
| // custom message the model sends to associated control to notify a last volume deleted from the object:
 | ||||
| wxDECLARE_EVENT(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED, wxCommandEvent); | ||||
| 
 | ||||
| class ObjectDataViewModel :public wxDataViewModel | ||||
| { | ||||
|     std::vector<ObjectDataViewModelNode*>       m_objects; | ||||
|     std::vector<wxBitmap*>                      m_volume_bmps; | ||||
|     wxBitmap*                                   m_warning_bmp { nullptr }; | ||||
| 
 | ||||
|     wxDataViewCtrl*                             m_ctrl { nullptr }; | ||||
| 
 | ||||
| public: | ||||
|     ObjectDataViewModel(); | ||||
|     ~ObjectDataViewModel(); | ||||
| 
 | ||||
|     wxDataViewItem Add( const wxString &name, | ||||
|                         const int extruder, | ||||
|                         const bool has_errors = false); | ||||
|     wxDataViewItem AddVolumeChild(  const wxDataViewItem &parent_item, | ||||
|                                     const wxString &name, | ||||
|                                     const Slic3r::ModelVolumeType volume_type, | ||||
|                                     const bool has_errors = false, | ||||
|                                     const int extruder = 0, | ||||
|                                     const bool create_frst_child = true); | ||||
|     wxDataViewItem AddSettingsChild(const wxDataViewItem &parent_item); | ||||
|     wxDataViewItem AddInstanceChild(const wxDataViewItem &parent_item, size_t num); | ||||
|     wxDataViewItem AddInstanceChild(const wxDataViewItem &parent_item, const std::vector<bool>& print_indicator); | ||||
|     wxDataViewItem AddLayersRoot(const wxDataViewItem &parent_item); | ||||
|     wxDataViewItem AddLayersChild(  const wxDataViewItem &parent_item, | ||||
|                                     const t_layer_height_range& layer_range, | ||||
|                                     const int extruder = 0, | ||||
|                                     const int index = -1); | ||||
|     wxDataViewItem Delete(const wxDataViewItem &item); | ||||
|     wxDataViewItem DeleteLastInstance(const wxDataViewItem &parent_item, size_t num); | ||||
|     void DeleteAll(); | ||||
|     void DeleteChildren(wxDataViewItem& parent); | ||||
|     void DeleteVolumeChildren(wxDataViewItem& parent); | ||||
|     void DeleteSettings(const wxDataViewItem& parent); | ||||
|     wxDataViewItem GetItemById(int obj_idx); | ||||
|     wxDataViewItem GetItemById(const int obj_idx, const int sub_obj_idx, const ItemType parent_type); | ||||
|     wxDataViewItem GetItemByVolumeId(int obj_idx, int volume_idx); | ||||
|     wxDataViewItem GetItemByInstanceId(int obj_idx, int inst_idx); | ||||
|     wxDataViewItem GetItemByLayerId(int obj_idx, int layer_idx); | ||||
|     wxDataViewItem GetItemByLayerRange(const int obj_idx, const t_layer_height_range& layer_range); | ||||
|     int  GetItemIdByLayerRange(const int obj_idx, const t_layer_height_range& layer_range); | ||||
|     int  GetIdByItem(const wxDataViewItem& item) const; | ||||
|     int  GetIdByItemAndType(const wxDataViewItem& item, const ItemType type) const; | ||||
|     int  GetObjectIdByItem(const wxDataViewItem& item) const; | ||||
|     int  GetVolumeIdByItem(const wxDataViewItem& item) const; | ||||
|     int  GetInstanceIdByItem(const wxDataViewItem& item) const; | ||||
|     int  GetLayerIdByItem(const wxDataViewItem& item) const; | ||||
|     void GetItemInfo(const wxDataViewItem& item, ItemType& type, int& obj_idx, int& idx); | ||||
|     int  GetRowByItem(const wxDataViewItem& item) const; | ||||
|     bool IsEmpty() { return m_objects.empty(); } | ||||
|     bool InvalidItem(const wxDataViewItem& item); | ||||
| 
 | ||||
|     // helper method for wxLog
 | ||||
| 
 | ||||
|     wxString    GetName(const wxDataViewItem &item) const; | ||||
|     wxBitmap&   GetBitmap(const wxDataViewItem &item) const; | ||||
|     wxString    GetExtruder(const wxDataViewItem &item) const; | ||||
|     int         GetExtruderNumber(const wxDataViewItem &item) const; | ||||
| 
 | ||||
|     // helper methods to change the model
 | ||||
| 
 | ||||
|     virtual unsigned int    GetColumnCount() const override { return 3;} | ||||
|     virtual wxString        GetColumnType(unsigned int col) const override{ return wxT("string"); } | ||||
| 
 | ||||
|     virtual void GetValue(  wxVariant &variant, | ||||
|                             const wxDataViewItem &item, | ||||
|                             unsigned int col) const override; | ||||
|     virtual bool SetValue(  const wxVariant &variant, | ||||
|                             const wxDataViewItem &item, | ||||
|                             unsigned int col) override; | ||||
|     bool SetValue(  const wxVariant &variant, | ||||
|                     const int item_idx, | ||||
|                     unsigned int col); | ||||
| 
 | ||||
|     void SetExtruder(const wxString& extruder, wxDataViewItem item); | ||||
| 
 | ||||
|     // For parent move child from cur_volume_id place to new_volume_id
 | ||||
|     // Remaining items will moved up/down accordingly
 | ||||
|     wxDataViewItem  ReorganizeChildren( const int cur_volume_id, | ||||
|                                         const int new_volume_id, | ||||
|                                         const wxDataViewItem &parent); | ||||
|     wxDataViewItem  ReorganizeObjects( int current_id, int new_id); | ||||
| 
 | ||||
|     virtual bool    IsEnabled(const wxDataViewItem &item, unsigned int col) const override; | ||||
| 
 | ||||
|     virtual wxDataViewItem  GetParent(const wxDataViewItem &item) const override; | ||||
|     // get object item
 | ||||
|     wxDataViewItem          GetTopParent(const wxDataViewItem &item) const; | ||||
|     virtual bool            IsContainer(const wxDataViewItem &item) const override; | ||||
|     virtual unsigned int    GetChildren(const wxDataViewItem &parent, | ||||
|                                         wxDataViewItemArray &array) const override; | ||||
|     void GetAllChildren(const wxDataViewItem &parent,wxDataViewItemArray &array) const; | ||||
|     // Is the container just a header or an item with all columns
 | ||||
|     // In our case it is an item with all columns
 | ||||
|     virtual bool    HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const override {	return true; } | ||||
| 
 | ||||
|     ItemType        GetItemType(const wxDataViewItem &item) const ; | ||||
|     wxDataViewItem  GetItemByType(  const wxDataViewItem &parent_item, | ||||
|                                     ItemType type) const; | ||||
|     wxDataViewItem  GetSettingsItem(const wxDataViewItem &item) const; | ||||
|     wxDataViewItem  GetInstanceRootItem(const wxDataViewItem &item) const; | ||||
|     wxDataViewItem  GetLayerRootItem(const wxDataViewItem &item) const; | ||||
|     bool    IsSettingsItem(const wxDataViewItem &item) const; | ||||
|     void    UpdateSettingsDigest(   const wxDataViewItem &item, | ||||
|                                     const std::vector<std::string>& categories); | ||||
| 
 | ||||
|     bool    IsPrintable(const wxDataViewItem &item) const; | ||||
|     void    UpdateObjectPrintable(wxDataViewItem parent_item); | ||||
|     void    UpdateInstancesPrintable(wxDataViewItem parent_item); | ||||
| 
 | ||||
|     void    SetVolumeBitmaps(const std::vector<wxBitmap*>& volume_bmps) { m_volume_bmps = volume_bmps; } | ||||
|     void    SetWarningBitmap(wxBitmap* bitmap)                          { m_warning_bmp = bitmap; } | ||||
|     void    SetVolumeType(const wxDataViewItem &item, const Slic3r::ModelVolumeType type); | ||||
|     wxDataViewItem SetPrintableState( PrintIndicator printable, int obj_idx, | ||||
|                                       int subobj_idx = -1,  | ||||
|                                       ItemType subobj_type = itInstance); | ||||
|     wxDataViewItem SetObjectPrintableState(PrintIndicator printable, wxDataViewItem obj_item); | ||||
| 
 | ||||
|     void    SetAssociatedControl(wxDataViewCtrl* ctrl) { m_ctrl = ctrl; } | ||||
|     // Rescale bitmaps for existing Items
 | ||||
|     void    Rescale(); | ||||
| 
 | ||||
|     wxBitmap    GetVolumeIcon(const Slic3r::ModelVolumeType vol_type, | ||||
|                               const bool is_marked = false); | ||||
|     void        DeleteWarningIcon(const wxDataViewItem& item, const bool unmark_object = false); | ||||
|     t_layer_height_range    GetLayerRangeByItem(const wxDataViewItem& item) const; | ||||
| 
 | ||||
|     bool        UpdateColumValues(unsigned col); | ||||
|     void        UpdateExtruderBitmap(wxDataViewItem item); | ||||
| 
 | ||||
| private: | ||||
|     wxDataViewItem AddRoot(const wxDataViewItem& parent_item, const ItemType root_type); | ||||
|     wxDataViewItem AddInstanceRoot(const wxDataViewItem& parent_item); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| #endif // slic3r_GUI_ObjectDataViewModel_hpp_
 | ||||
|  | @ -1529,30 +1529,6 @@ void PresetBundle::set_filament_preset(size_t idx, const std::string &name) | |||
|     filament_presets[idx] = Preset::remove_suffix_modified(name); | ||||
| } | ||||
| 
 | ||||
| static inline int hex_digit_to_int(const char c) | ||||
| { | ||||
|     return  | ||||
|         (c >= '0' && c <= '9') ? int(c - '0') :  | ||||
|         (c >= 'A' && c <= 'F') ? int(c - 'A') + 10 : | ||||
|         (c >= 'a' && c <= 'f') ? int(c - 'a') + 10 : -1; | ||||
| } | ||||
| 
 | ||||
| bool PresetBundle::parse_color(const std::string &scolor, unsigned char *rgb_out) | ||||
| { | ||||
|     rgb_out[0] = rgb_out[1] = rgb_out[2] = 0; | ||||
|     if (scolor.size() != 7 || scolor.front() != '#') | ||||
|         return false; | ||||
|     const char *c = scolor.data() + 1; | ||||
|     for (size_t i = 0; i < 3; ++ i) { | ||||
|         int digit1 = hex_digit_to_int(*c ++); | ||||
|         int digit2 = hex_digit_to_int(*c ++); | ||||
|         if (digit1 == -1 || digit2 == -1) | ||||
|             return false; | ||||
|         rgb_out[i] = (unsigned char)(digit1 * 16 + digit2); | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| void PresetBundle::load_default_preset_bitmaps() | ||||
| { | ||||
|     // Clear bitmap cache, before load new scaled default preset bitmaps 
 | ||||
|  | @ -1580,7 +1556,7 @@ void PresetBundle::update_plater_filament_ui(unsigned int idx_extruder, GUI::Pre | |||
| 
 | ||||
|     unsigned char rgb[3]; | ||||
|     std::string extruder_color = this->printers.get_edited_preset().config.opt_string("extruder_colour", idx_extruder); | ||||
|     if (! parse_color(extruder_color, rgb)) | ||||
|     if (!m_bitmapCache->parse_color(extruder_color, rgb)) | ||||
|         // Extruder color is not defined.
 | ||||
|         extruder_color.clear(); | ||||
| 
 | ||||
|  | @ -1650,10 +1626,10 @@ void PresetBundle::update_plater_filament_ui(unsigned int idx_extruder, GUI::Pre | |||
|                 // Paint a red flag for incompatible presets.
 | ||||
|                 bmps.emplace_back(preset.is_compatible ? m_bitmapCache->mkclear(normal_icon_width, icon_height) : *m_bitmapIncompatible); | ||||
|             // Paint the color bars.
 | ||||
|             parse_color(filament_rgb, rgb); | ||||
|             m_bitmapCache->parse_color(filament_rgb, rgb); | ||||
|             bmps.emplace_back(m_bitmapCache->mksolid(single_bar ? wide_icon_width : normal_icon_width, icon_height, rgb)); | ||||
|             if (! single_bar) { | ||||
|                 parse_color(extruder_rgb, rgb); | ||||
|                 m_bitmapCache->parse_color(extruder_rgb, rgb); | ||||
|                 bmps.emplace_back(m_bitmapCache->mksolid(thin_icon_width, icon_height, rgb)); | ||||
|             } | ||||
|             // Paint a lock at the system presets.
 | ||||
|  |  | |||
|  | @ -129,8 +129,6 @@ public: | |||
|     // preset if the current print or filament preset is not compatible.
 | ||||
|     void                        update_compatible(bool select_other_if_incompatible); | ||||
| 
 | ||||
|     static bool                 parse_color(const std::string &scolor, unsigned char *rgb_out); | ||||
| 
 | ||||
|     void                        load_default_preset_bitmaps(); | ||||
| 
 | ||||
|     // Set the is_visible flag for printer vendors, printer models and printer variants
 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| #include <algorithm> | ||||
| #include <sstream> | ||||
| #include "WipeTowerDialog.hpp" | ||||
| #include "PresetBundle.hpp" | ||||
| #include "BitmapCache.hpp" | ||||
| #include "GUI.hpp" | ||||
| #include "I18N.hpp" | ||||
| #include "GUI_App.hpp" | ||||
|  | @ -191,7 +191,7 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector<float>& matrix, con | |||
| 
 | ||||
|     for (const std::string& color : extruder_colours) { | ||||
|         unsigned char rgb[3]; | ||||
|         Slic3r::PresetBundle::parse_color(color, rgb); | ||||
|         Slic3r::GUI::BitmapCache::parse_color(color, rgb); | ||||
|         m_colours.push_back(wxColor(rgb[0], rgb[1], rgb[2])); | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -4,24 +4,14 @@ | |||
| #include <wx/checklst.h> | ||||
| #include <wx/combo.h> | ||||
| #include <wx/dataview.h> | ||||
| #include <wx/dc.h> | ||||
| #include <wx/wupdlock.h> | ||||
| #include <wx/button.h> | ||||
| #include <wx/sizer.h> | ||||
| #include <wx/menu.h> | ||||
| #include <wx/bmpcbox.h> | ||||
| #include <wx/wx.h> | ||||
| 
 | ||||
| #include <vector> | ||||
| #include <set> | ||||
| #include <functional> | ||||
| 
 | ||||
| namespace Slic3r { | ||||
|     enum class ModelVolumeType : int; | ||||
| }; | ||||
| 
 | ||||
| typedef double                          coordf_t; | ||||
| typedef std::pair<coordf_t, coordf_t>   t_layer_height_range; | ||||
| 
 | ||||
| #ifdef __WXMSW__ | ||||
| void                msw_rescale_menu(wxMenu* menu); | ||||
|  | @ -49,7 +39,6 @@ wxMenuItem* append_menu_check_item(wxMenu* menu, int id, const wxString& string, | |||
| void enable_menu_item(wxUpdateUIEvent& evt, std::function<bool()> const cb_condition, wxMenuItem* item, wxWindow* win); | ||||
| 
 | ||||
| class wxDialog; | ||||
| class wxBitmapComboBox; | ||||
| 
 | ||||
| void    edit_tooltip(wxString& tooltip); | ||||
| void    msw_buttons_rescale(wxDialog* dlg, const int em_unit, const std::vector<int>& btn_ids); | ||||
|  | @ -158,593 +147,6 @@ public: | |||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| // DataViewBitmapText: helper class used by PrusaBitmapTextRenderer
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| 
 | ||||
| class DataViewBitmapText : public wxObject | ||||
| { | ||||
| public: | ||||
|     DataViewBitmapText( const wxString &text = wxEmptyString, | ||||
|                         const wxBitmap& bmp = wxNullBitmap) : | ||||
|         m_text(text), | ||||
|         m_bmp(bmp) | ||||
|     { } | ||||
| 
 | ||||
|     DataViewBitmapText(const DataViewBitmapText &other) | ||||
|         : wxObject(), | ||||
|         m_text(other.m_text), | ||||
|         m_bmp(other.m_bmp) | ||||
|     { } | ||||
| 
 | ||||
|     void SetText(const wxString &text)      { m_text = text; } | ||||
|     wxString GetText() const                { return m_text; } | ||||
|     void SetBitmap(const wxBitmap &bmp)     { m_bmp = bmp; } | ||||
|     const wxBitmap &GetBitmap() const       { return m_bmp; } | ||||
| 
 | ||||
|     bool IsSameAs(const DataViewBitmapText& other) const { | ||||
|         return m_text == other.m_text && m_bmp.IsSameAs(other.m_bmp); | ||||
|     } | ||||
| 
 | ||||
|     bool operator==(const DataViewBitmapText& other) const { | ||||
|         return IsSameAs(other); | ||||
|     } | ||||
| 
 | ||||
|     bool operator!=(const DataViewBitmapText& other) const { | ||||
|         return !IsSameAs(other); | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     wxString    m_text; | ||||
|     wxBitmap    m_bmp; | ||||
| 
 | ||||
|     wxDECLARE_DYNAMIC_CLASS(DataViewBitmapText); | ||||
| }; | ||||
| DECLARE_VARIANT_OBJECT(DataViewBitmapText) | ||||
| 
 | ||||
| 
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| // ObjectDataViewModelNode: a node inside ObjectDataViewModel
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| 
 | ||||
| enum ItemType { | ||||
|     itUndef         = 0, | ||||
|     itObject        = 1, | ||||
|     itVolume        = 2, | ||||
|     itInstanceRoot  = 4, | ||||
|     itInstance      = 8, | ||||
|     itSettings      = 16, | ||||
|     itLayerRoot     = 32, | ||||
|     itLayer         = 64, | ||||
| }; | ||||
| 
 | ||||
| enum ColumnNumber | ||||
| { | ||||
|     colName         = 0,    // item name
 | ||||
|     colPrint           ,    // printable property
 | ||||
|     colExtruder        ,    // extruder selection
 | ||||
|     colEditing         ,    // item editing
 | ||||
| }; | ||||
| 
 | ||||
| enum PrintIndicator | ||||
| { | ||||
|     piUndef         = 0,    // no print indicator
 | ||||
|     piPrintable        ,    // printable
 | ||||
|     piUnprintable      ,    // unprintable
 | ||||
| }; | ||||
| 
 | ||||
| class ObjectDataViewModelNode; | ||||
| WX_DEFINE_ARRAY_PTR(ObjectDataViewModelNode*, MyObjectTreeModelNodePtrArray); | ||||
| 
 | ||||
| class ObjectDataViewModelNode | ||||
| { | ||||
|     ObjectDataViewModelNode*	    m_parent; | ||||
|     MyObjectTreeModelNodePtrArray   m_children; | ||||
|     wxBitmap                        m_empty_bmp; | ||||
|     size_t                          m_volumes_cnt = 0; | ||||
|     std::vector< std::string >      m_opt_categories; | ||||
|     t_layer_height_range            m_layer_range = { 0.0f, 0.0f }; | ||||
| 
 | ||||
|     wxString				        m_name; | ||||
|     wxBitmap&                       m_bmp = m_empty_bmp; | ||||
|     ItemType				        m_type; | ||||
|     int                             m_idx = -1; | ||||
|     bool					        m_container = false; | ||||
|     wxString				        m_extruder = "default"; | ||||
|     wxBitmap                        m_extruder_bmp; | ||||
|     wxBitmap				        m_action_icon; | ||||
|     PrintIndicator                  m_printable {piUndef}; | ||||
|     wxBitmap				        m_printable_icon; | ||||
| 
 | ||||
|     std::string                     m_action_icon_name = ""; | ||||
|     Slic3r::ModelVolumeType         m_volume_type; | ||||
| 
 | ||||
| public: | ||||
|     ObjectDataViewModelNode(const wxString& name, | ||||
|                             const wxString& extruder): | ||||
|         m_parent(NULL), | ||||
|         m_name(name), | ||||
|         m_type(itObject), | ||||
|         m_extruder(extruder) | ||||
|     { | ||||
|         set_action_and_extruder_icons(); | ||||
|         init_container(); | ||||
| 	} | ||||
| 
 | ||||
|     ObjectDataViewModelNode(ObjectDataViewModelNode* parent, | ||||
|                             const wxString& sub_obj_name, | ||||
|                             const wxBitmap& bmp, | ||||
|                             const wxString& extruder, | ||||
|                             const int idx = -1 ) : | ||||
|         m_parent	(parent), | ||||
|         m_name		(sub_obj_name), | ||||
|         m_type		(itVolume), | ||||
|         m_idx       (idx), | ||||
|         m_extruder  (extruder) | ||||
|     { | ||||
|         m_bmp = bmp; | ||||
|         set_action_and_extruder_icons(); | ||||
|         init_container(); | ||||
|     } | ||||
| 
 | ||||
|     ObjectDataViewModelNode(ObjectDataViewModelNode* parent, | ||||
|                             const t_layer_height_range& layer_range, | ||||
|                             const int idx = -1, | ||||
|                             const wxString& extruder = wxEmptyString ); | ||||
| 
 | ||||
|     ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const ItemType type); | ||||
| 
 | ||||
|     ~ObjectDataViewModelNode() | ||||
|     { | ||||
|         // free all our children nodes
 | ||||
|         size_t count = m_children.GetCount(); | ||||
|         for (size_t i = 0; i < count; i++) | ||||
|         { | ||||
|             ObjectDataViewModelNode *child = m_children[i]; | ||||
|             delete child; | ||||
|         } | ||||
| #ifndef NDEBUG | ||||
|         // Indicate that the object was deleted.
 | ||||
|         m_idx = -2; | ||||
| #endif /* NDEBUG */ | ||||
|     } | ||||
| 
 | ||||
| 	void init_container(); | ||||
| 	bool IsContainer() const | ||||
| 	{ | ||||
| 		return m_container; | ||||
| 	} | ||||
| 
 | ||||
|     ObjectDataViewModelNode* GetParent() | ||||
|     { | ||||
|         assert(m_parent == nullptr || m_parent->valid()); | ||||
|         return m_parent; | ||||
|     } | ||||
|     MyObjectTreeModelNodePtrArray& GetChildren() | ||||
|     { | ||||
|         return m_children; | ||||
|     } | ||||
|     ObjectDataViewModelNode* GetNthChild(unsigned int n) | ||||
|     { | ||||
|         return m_children.Item(n); | ||||
|     } | ||||
|     void Insert(ObjectDataViewModelNode* child, unsigned int n) | ||||
|     { | ||||
|         if (!m_container) | ||||
|             m_container = true; | ||||
|         m_children.Insert(child, n); | ||||
|     } | ||||
|     void Append(ObjectDataViewModelNode* child) | ||||
|     { | ||||
|         if (!m_container) | ||||
|             m_container = true; | ||||
|         m_children.Add(child); | ||||
|     } | ||||
|     void RemoveAllChildren() | ||||
|     { | ||||
|         if (GetChildCount() == 0) | ||||
|             return; | ||||
|         for (int id = int(GetChildCount()) - 1; id >= 0; --id) | ||||
|         { | ||||
|             if (m_children.Item(id)->GetChildCount() > 0) | ||||
|                 m_children[id]->RemoveAllChildren(); | ||||
|             auto node = m_children[id]; | ||||
|             m_children.RemoveAt(id); | ||||
|             delete node; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     size_t GetChildCount() const | ||||
|     { | ||||
|         return m_children.GetCount(); | ||||
|     } | ||||
| 
 | ||||
|     bool            SetValue(const wxVariant &variant, unsigned int col); | ||||
| 
 | ||||
|     void            SetBitmap(const wxBitmap &icon) { m_bmp = icon; } | ||||
|     const wxBitmap& GetBitmap() const               { return m_bmp; } | ||||
|     const wxString& GetName() const                 { return m_name; } | ||||
|     ItemType        GetType() const                 { return m_type; } | ||||
| 	void			SetIdx(const int& idx); | ||||
| 	int             GetIdx() const                  { return m_idx; } | ||||
| 	t_layer_height_range    GetLayerRange() const   { return m_layer_range; } | ||||
|     PrintIndicator  IsPrintable() const             { return m_printable; } | ||||
| 
 | ||||
|     // use this function only for childrens
 | ||||
|     void AssignAllVal(ObjectDataViewModelNode& from_node) | ||||
|     { | ||||
|         // ! Don't overwrite other values because of equality of this values for all children --
 | ||||
|         m_name = from_node.m_name; | ||||
|         m_bmp = from_node.m_bmp; | ||||
|         m_idx = from_node.m_idx; | ||||
|         m_extruder = from_node.m_extruder; | ||||
|         m_type = from_node.m_type; | ||||
|     } | ||||
| 
 | ||||
|     bool SwapChildrens(int frst_id, int scnd_id) { | ||||
|         if (GetChildCount() < 2 || | ||||
|             frst_id < 0 || (size_t)frst_id >= GetChildCount() || | ||||
|             scnd_id < 0 || (size_t)scnd_id >= GetChildCount()) | ||||
|             return false; | ||||
| 
 | ||||
|         ObjectDataViewModelNode new_scnd = *GetNthChild(frst_id); | ||||
|         ObjectDataViewModelNode new_frst = *GetNthChild(scnd_id); | ||||
| 
 | ||||
|         new_scnd.m_idx = m_children.Item(scnd_id)->m_idx; | ||||
|         new_frst.m_idx = m_children.Item(frst_id)->m_idx; | ||||
| 
 | ||||
|         m_children.Item(frst_id)->AssignAllVal(new_frst); | ||||
|         m_children.Item(scnd_id)->AssignAllVal(new_scnd); | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     // Set action icons for node
 | ||||
|     void        set_action_and_extruder_icons(); | ||||
| 	// Set printable icon for node
 | ||||
|     void        set_printable_icon(PrintIndicator printable); | ||||
| 
 | ||||
|     void        update_settings_digest_bitmaps(); | ||||
|     bool        update_settings_digest(const std::vector<std::string>& categories); | ||||
|     int         volume_type() const { return int(m_volume_type); } | ||||
|     void        msw_rescale(); | ||||
| 
 | ||||
| #ifndef NDEBUG | ||||
|     bool 		valid(); | ||||
| #endif /* NDEBUG */ | ||||
|     bool        invalid() const { return m_idx < -1; } | ||||
| 
 | ||||
| private: | ||||
|     friend class ObjectDataViewModel; | ||||
| }; | ||||
| 
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| // ObjectDataViewModel
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| 
 | ||||
| // custom message the model sends to associated control to notify a last volume deleted from the object:
 | ||||
| wxDECLARE_EVENT(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED, wxCommandEvent); | ||||
| 
 | ||||
| class ObjectDataViewModel :public wxDataViewModel | ||||
| { | ||||
|     std::vector<ObjectDataViewModelNode*>       m_objects; | ||||
|     std::vector<wxBitmap*>                      m_volume_bmps; | ||||
|     wxBitmap*                                   m_warning_bmp { nullptr }; | ||||
| 
 | ||||
|     wxDataViewCtrl*                             m_ctrl { nullptr }; | ||||
| 
 | ||||
| public: | ||||
|     ObjectDataViewModel(); | ||||
|     ~ObjectDataViewModel(); | ||||
| 
 | ||||
|     wxDataViewItem Add( const wxString &name, | ||||
|                         const int extruder, | ||||
|                         const bool has_errors = false); | ||||
|     wxDataViewItem AddVolumeChild(  const wxDataViewItem &parent_item, | ||||
|                                     const wxString &name, | ||||
|                                     const Slic3r::ModelVolumeType volume_type, | ||||
|                                     const bool has_errors = false, | ||||
|                                     const int extruder = 0, | ||||
|                                     const bool create_frst_child = true); | ||||
|     wxDataViewItem AddSettingsChild(const wxDataViewItem &parent_item); | ||||
|     wxDataViewItem AddInstanceChild(const wxDataViewItem &parent_item, size_t num); | ||||
|     wxDataViewItem AddInstanceChild(const wxDataViewItem &parent_item, const std::vector<bool>& print_indicator); | ||||
|     wxDataViewItem AddLayersRoot(const wxDataViewItem &parent_item); | ||||
|     wxDataViewItem AddLayersChild(  const wxDataViewItem &parent_item, | ||||
|                                     const t_layer_height_range& layer_range, | ||||
|                                     const int extruder = 0, | ||||
|                                     const int index = -1); | ||||
|     wxDataViewItem Delete(const wxDataViewItem &item); | ||||
|     wxDataViewItem DeleteLastInstance(const wxDataViewItem &parent_item, size_t num); | ||||
|     void DeleteAll(); | ||||
|     void DeleteChildren(wxDataViewItem& parent); | ||||
|     void DeleteVolumeChildren(wxDataViewItem& parent); | ||||
|     void DeleteSettings(const wxDataViewItem& parent); | ||||
|     wxDataViewItem GetItemById(int obj_idx); | ||||
|     wxDataViewItem GetItemById(const int obj_idx, const int sub_obj_idx, const ItemType parent_type); | ||||
|     wxDataViewItem GetItemByVolumeId(int obj_idx, int volume_idx); | ||||
|     wxDataViewItem GetItemByInstanceId(int obj_idx, int inst_idx); | ||||
|     wxDataViewItem GetItemByLayerId(int obj_idx, int layer_idx); | ||||
|     wxDataViewItem GetItemByLayerRange(const int obj_idx, const t_layer_height_range& layer_range); | ||||
|     int  GetItemIdByLayerRange(const int obj_idx, const t_layer_height_range& layer_range); | ||||
|     int  GetIdByItem(const wxDataViewItem& item) const; | ||||
|     int  GetIdByItemAndType(const wxDataViewItem& item, const ItemType type) const; | ||||
|     int  GetObjectIdByItem(const wxDataViewItem& item) const; | ||||
|     int  GetVolumeIdByItem(const wxDataViewItem& item) const; | ||||
|     int  GetInstanceIdByItem(const wxDataViewItem& item) const; | ||||
|     int  GetLayerIdByItem(const wxDataViewItem& item) const; | ||||
|     void GetItemInfo(const wxDataViewItem& item, ItemType& type, int& obj_idx, int& idx); | ||||
|     int  GetRowByItem(const wxDataViewItem& item) const; | ||||
|     bool IsEmpty() { return m_objects.empty(); } | ||||
|     bool InvalidItem(const wxDataViewItem& item); | ||||
| 
 | ||||
|     // helper method for wxLog
 | ||||
| 
 | ||||
|     wxString    GetName(const wxDataViewItem &item) const; | ||||
|     wxBitmap&   GetBitmap(const wxDataViewItem &item) const; | ||||
|     wxString    GetExtruder(const wxDataViewItem &item) const; | ||||
|     int         GetExtruderNumber(const wxDataViewItem &item) const; | ||||
| 
 | ||||
|     // helper methods to change the model
 | ||||
| 
 | ||||
|     virtual unsigned int    GetColumnCount() const override { return 3;} | ||||
|     virtual wxString        GetColumnType(unsigned int col) const override{ return wxT("string"); } | ||||
| 
 | ||||
|     virtual void GetValue(  wxVariant &variant, | ||||
|                             const wxDataViewItem &item, | ||||
|                             unsigned int col) const override; | ||||
|     virtual bool SetValue(  const wxVariant &variant, | ||||
|                             const wxDataViewItem &item, | ||||
|                             unsigned int col) override; | ||||
|     bool SetValue(  const wxVariant &variant, | ||||
|                     const int item_idx, | ||||
|                     unsigned int col); | ||||
| 
 | ||||
|     void SetExtruder(const wxString& extruder, wxDataViewItem item); | ||||
| 
 | ||||
|     // For parent move child from cur_volume_id place to new_volume_id
 | ||||
|     // Remaining items will moved up/down accordingly
 | ||||
|     wxDataViewItem  ReorganizeChildren( const int cur_volume_id, | ||||
|                                         const int new_volume_id, | ||||
|                                         const wxDataViewItem &parent); | ||||
|     wxDataViewItem  ReorganizeObjects( int current_id, int new_id); | ||||
| 
 | ||||
|     virtual bool    IsEnabled(const wxDataViewItem &item, unsigned int col) const override; | ||||
| 
 | ||||
|     virtual wxDataViewItem  GetParent(const wxDataViewItem &item) const override; | ||||
|     // get object item
 | ||||
|     wxDataViewItem          GetTopParent(const wxDataViewItem &item) const; | ||||
|     virtual bool            IsContainer(const wxDataViewItem &item) const override; | ||||
|     virtual unsigned int    GetChildren(const wxDataViewItem &parent, | ||||
|                                         wxDataViewItemArray &array) const override; | ||||
|     void GetAllChildren(const wxDataViewItem &parent,wxDataViewItemArray &array) const; | ||||
|     // Is the container just a header or an item with all columns
 | ||||
|     // In our case it is an item with all columns
 | ||||
|     virtual bool    HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const override {	return true; } | ||||
| 
 | ||||
|     ItemType        GetItemType(const wxDataViewItem &item) const ; | ||||
|     wxDataViewItem  GetItemByType(  const wxDataViewItem &parent_item, | ||||
|                                     ItemType type) const; | ||||
|     wxDataViewItem  GetSettingsItem(const wxDataViewItem &item) const; | ||||
|     wxDataViewItem  GetInstanceRootItem(const wxDataViewItem &item) const; | ||||
|     wxDataViewItem  GetLayerRootItem(const wxDataViewItem &item) const; | ||||
|     bool    IsSettingsItem(const wxDataViewItem &item) const; | ||||
|     void    UpdateSettingsDigest(   const wxDataViewItem &item, | ||||
|                                     const std::vector<std::string>& categories); | ||||
| 
 | ||||
|     bool    IsPrintable(const wxDataViewItem &item) const; | ||||
|     void    UpdateObjectPrintable(wxDataViewItem parent_item); | ||||
|     void    UpdateInstancesPrintable(wxDataViewItem parent_item); | ||||
| 
 | ||||
|     void    SetVolumeBitmaps(const std::vector<wxBitmap*>& volume_bmps) { m_volume_bmps = volume_bmps; } | ||||
|     void    SetWarningBitmap(wxBitmap* bitmap)                          { m_warning_bmp = bitmap; } | ||||
|     void    SetVolumeType(const wxDataViewItem &item, const Slic3r::ModelVolumeType type); | ||||
|     wxDataViewItem SetPrintableState( PrintIndicator printable, int obj_idx, | ||||
|                                       int subobj_idx = -1,  | ||||
|                                       ItemType subobj_type = itInstance); | ||||
|     wxDataViewItem SetObjectPrintableState(PrintIndicator printable, wxDataViewItem obj_item); | ||||
| 
 | ||||
|     void    SetAssociatedControl(wxDataViewCtrl* ctrl) { m_ctrl = ctrl; } | ||||
|     // Rescale bitmaps for existing Items
 | ||||
|     void    Rescale(); | ||||
| 
 | ||||
|     wxBitmap    GetVolumeIcon(const Slic3r::ModelVolumeType vol_type, | ||||
|                               const bool is_marked = false); | ||||
|     void        DeleteWarningIcon(const wxDataViewItem& item, const bool unmark_object = false); | ||||
|     t_layer_height_range    GetLayerRangeByItem(const wxDataViewItem& item) const; | ||||
| 
 | ||||
|     bool        UpdateColumValues(unsigned col); | ||||
|     void        UpdateExtruderBitmap(wxDataViewItem item); | ||||
| 
 | ||||
| private: | ||||
|     wxDataViewItem AddRoot(const wxDataViewItem& parent_item, const ItemType root_type); | ||||
|     wxDataViewItem AddInstanceRoot(const wxDataViewItem& parent_item); | ||||
| }; | ||||
| 
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| // BitmapTextRenderer
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| #if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING | ||||
| class BitmapTextRenderer : public wxDataViewRenderer | ||||
| #else | ||||
| class BitmapTextRenderer : public wxDataViewCustomRenderer | ||||
| #endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
 | ||||
| { | ||||
| public: | ||||
|     BitmapTextRenderer( wxWindow* parent, | ||||
|                         wxDataViewCellMode mode = | ||||
| #ifdef __WXOSX__ | ||||
|                                                         wxDATAVIEW_CELL_INERT | ||||
| #else | ||||
|                                                         wxDATAVIEW_CELL_EDITABLE | ||||
| #endif | ||||
| 
 | ||||
|                             ,int align = wxDVR_DEFAULT_ALIGNMENT | ||||
| #if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING | ||||
|                             ); | ||||
| #else | ||||
|                             ) :  | ||||
|     wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align), | ||||
|     m_parent(parent) | ||||
|     {} | ||||
| #endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
 | ||||
| 
 | ||||
|     bool SetValue(const wxVariant &value); | ||||
|     bool GetValue(wxVariant &value) const; | ||||
| #if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING && wxUSE_ACCESSIBILITY | ||||
|     virtual wxString GetAccessibleDescription() const override; | ||||
| #endif // wxUSE_ACCESSIBILITY && ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
 | ||||
| 
 | ||||
|     virtual bool Render(wxRect cell, wxDC *dc, int state); | ||||
|     virtual wxSize GetSize() const; | ||||
| 
 | ||||
|     bool        HasEditorCtrl() const override | ||||
|     { | ||||
| #ifdef __WXOSX__ | ||||
|         return false; | ||||
| #else | ||||
|         return true; | ||||
| #endif | ||||
|     } | ||||
|     wxWindow*   CreateEditorCtrl(wxWindow* parent, | ||||
|                                  wxRect labelRect, | ||||
|                                  const wxVariant& value) override; | ||||
|     bool        GetValueFromEditorCtrl( wxWindow* ctrl, | ||||
|                                         wxVariant& value) override; | ||||
|     bool        WasCanceled() const { return m_was_unusable_symbol; } | ||||
| 
 | ||||
| private: | ||||
|     DataViewBitmapText  m_value; | ||||
|     bool                m_was_unusable_symbol {false}; | ||||
|     wxWindow*           m_parent {nullptr}; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| // BitmapChoiceRenderer
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| 
 | ||||
| class BitmapChoiceRenderer : public wxDataViewCustomRenderer | ||||
| { | ||||
| public: | ||||
|     BitmapChoiceRenderer(wxDataViewCellMode mode = | ||||
| #ifdef __WXOSX__ | ||||
|                                                     wxDATAVIEW_CELL_INERT | ||||
| #else | ||||
|                                                     wxDATAVIEW_CELL_EDITABLE | ||||
| #endif | ||||
|                          ,int align = wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | ||||
|         ) : wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align) {} | ||||
| 
 | ||||
|     bool SetValue(const wxVariant& value); | ||||
|     bool GetValue(wxVariant& value) const; | ||||
| 
 | ||||
|     virtual bool Render(wxRect cell, wxDC* dc, int state); | ||||
|     virtual wxSize GetSize() const; | ||||
| 
 | ||||
|     bool        HasEditorCtrl() const override { return true; } | ||||
|     wxWindow*   CreateEditorCtrl(wxWindow* parent, | ||||
|                                  wxRect labelRect, | ||||
|                                  const wxVariant& value) override; | ||||
|     bool        GetValueFromEditorCtrl( wxWindow* ctrl, | ||||
|                                         wxVariant& value) override; | ||||
| 
 | ||||
| private: | ||||
|     DataViewBitmapText  m_value; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| // MyCustomRenderer
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| 
 | ||||
| class MyCustomRenderer : public wxDataViewCustomRenderer | ||||
| { | ||||
| public: | ||||
|     // This renderer can be either activatable or editable, for demonstration
 | ||||
|     // purposes. In real programs, you should select whether the user should be
 | ||||
|     // able to activate or edit the cell and it doesn't make sense to switch
 | ||||
|     // between the two -- but this is just an example, so it doesn't stop us.
 | ||||
|     explicit MyCustomRenderer(wxDataViewCellMode mode) | ||||
|         : wxDataViewCustomRenderer("string", mode, wxALIGN_CENTER) | ||||
|     { } | ||||
| 
 | ||||
|     virtual bool Render(wxRect rect, wxDC *dc, int state) override/*wxOVERRIDE*/ | ||||
|     { | ||||
|         dc->SetBrush(*wxLIGHT_GREY_BRUSH); | ||||
|         dc->SetPen(*wxTRANSPARENT_PEN); | ||||
| 
 | ||||
|         rect.Deflate(2); | ||||
|         dc->DrawRoundedRectangle(rect, 5); | ||||
| 
 | ||||
|         RenderText(m_value, | ||||
|             0, // no offset
 | ||||
|             wxRect(dc->GetTextExtent(m_value)).CentreIn(rect), | ||||
|             dc, | ||||
|             state); | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|         virtual bool ActivateCell(const wxRect& WXUNUSED(cell), | ||||
|         wxDataViewModel *WXUNUSED(model), | ||||
|         const wxDataViewItem &WXUNUSED(item), | ||||
|         unsigned int WXUNUSED(col), | ||||
|         const wxMouseEvent *mouseEvent) override/*wxOVERRIDE*/ | ||||
|     { | ||||
|         wxString position; | ||||
|         if (mouseEvent) | ||||
|             position = wxString::Format("via mouse at %d, %d", mouseEvent->m_x, mouseEvent->m_y); | ||||
|         else | ||||
|             position = "from keyboard"; | ||||
| //		wxLogMessage("MyCustomRenderer ActivateCell() %s", position);
 | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|         virtual wxSize GetSize() const override/*wxOVERRIDE*/ | ||||
|     { | ||||
|         return wxSize(60, 20); | ||||
|     } | ||||
| 
 | ||||
|         virtual bool SetValue(const wxVariant &value) override/*wxOVERRIDE*/ | ||||
|     { | ||||
|         m_value = value.GetString(); | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|         virtual bool GetValue(wxVariant &WXUNUSED(value)) const override/*wxOVERRIDE*/{ return true; } | ||||
| 
 | ||||
|         virtual bool HasEditorCtrl() const override/*wxOVERRIDE*/{ return true; } | ||||
| 
 | ||||
|         virtual wxWindow* | ||||
|         CreateEditorCtrl(wxWindow* parent, | ||||
|         wxRect labelRect, | ||||
|         const wxVariant& value) override/*wxOVERRIDE*/ | ||||
|     { | ||||
|         wxTextCtrl* text = new wxTextCtrl(parent, wxID_ANY, value, | ||||
|         labelRect.GetPosition(), | ||||
|         labelRect.GetSize(), | ||||
|         wxTE_PROCESS_ENTER); | ||||
|         text->SetInsertionPointEnd(); | ||||
| 
 | ||||
|         return text; | ||||
|     } | ||||
| 
 | ||||
|         virtual bool | ||||
|             GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value) override/*wxOVERRIDE*/ | ||||
|     { | ||||
|         wxTextCtrl* text = wxDynamicCast(ctrl, wxTextCtrl); | ||||
|         if (!text) | ||||
|             return false; | ||||
| 
 | ||||
|         value = text->GetValue(); | ||||
| 
 | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     wxString m_value; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
| // ScalableBitmap
 | ||||
| // ----------------------------------------------------------------------------
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 YuSanka
						YuSanka