mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	 77e4599c4a
			
		
	
	
		77e4599c4a
		
	
	
	
	
		
			
			1.supports filament sort 2.printable supports batch selection Change-Id: I231b8add4f43550f4854796cfd804f86251604e7
		
			
				
	
	
		
			651 lines
		
	
	
	
		
			23 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			651 lines
		
	
	
	
		
			23 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef slic3r_GUI_ObjectTable_hpp_
 | |
| #define slic3r_GUI_ObjectTable_hpp_
 | |
| 
 | |
| #include <wx/wx.h>
 | |
| #include <wx/intl.h>
 | |
| #include <wx/generic/gridsel.h>
 | |
| #include <wx/grid.h>
 | |
| #include <wx/renderer.h>
 | |
| #include <wx/gdicmn.h>
 | |
| #include <wx/valnum.h>
 | |
| #include <wx/font.h>
 | |
| #include <wx/colour.h>
 | |
| #include <wx/settings.h>
 | |
| #include <wx/string.h>
 | |
| #include <wx/sizer.h>
 | |
| #include <wx/stattext.h>
 | |
| #include <wx/popupwin.h>
 | |
| 
 | |
| #include "Plater.hpp"
 | |
| #include "libslic3r/Model.hpp"
 | |
| //#include "libslic3r/Print.hpp"
 | |
| #include "libslic3r/PrintConfig.hpp"
 | |
| #include "OptionsGroup.hpp"
 | |
| #include "GUI_Factories.hpp"
 | |
| #include "GUI_ObjectTableSettings.hpp"
 | |
| #include "Widgets/TextInput.hpp"
 | |
| 
 | |
| class ComboBox;
 | |
| class TextInput;
 | |
| 
 | |
| namespace Slic3r {
 | |
| 
 | |
| 
 | |
| namespace GUI {
 | |
| 
 | |
| class ObjectTablePanel;
 | |
| 
 | |
| class GridCellIconRenderer : public wxGridCellRenderer
 | |
| {
 | |
| public:
 | |
|     virtual void Draw(wxGrid& grid,
 | |
|                       wxGridCellAttr& attr,
 | |
|                       wxDC& dc,
 | |
|                       const wxRect& rect,
 | |
|                       int row, int col,
 | |
|                       bool isSelected) wxOVERRIDE;
 | |
| 
 | |
|     virtual wxSize GetBestSize(wxGrid& WXUNUSED(grid),
 | |
|                                wxGridCellAttr& attr,
 | |
|                                wxDC& dc,
 | |
|                                int WXUNUSED(row),
 | |
|                                int WXUNUSED(col)) wxOVERRIDE;
 | |
| 
 | |
|     virtual GridCellIconRenderer *Clone() const wxOVERRIDE;
 | |
| };
 | |
| 
 | |
| class GridCellTextEditor : public wxGridCellTextEditor
 | |
| {
 | |
| public:
 | |
|     GridCellTextEditor();
 | |
|     ~GridCellTextEditor();
 | |
| 
 | |
|     virtual void Create(wxWindow *parent, wxWindowID id, wxEvtHandler *evtHandler) wxOVERRIDE;
 | |
|     void         StartingKey(wxKeyEvent &event) wxOVERRIDE;
 | |
|     virtual void SetSize(const wxRect &rect) wxOVERRIDE;
 | |
|     virtual void BeginEdit(int row, int col, wxGrid *grid) wxOVERRIDE;
 | |
|     virtual bool EndEdit(int row, int col, const wxGrid *grid, const wxString &oldval, wxString *newval) wxOVERRIDE;
 | |
|     virtual void ApplyEdit(int row, int col, wxGrid *grid) wxOVERRIDE;
 | |
| 
 | |
| protected:
 | |
|     ::TextInput *Text() const { return (::TextInput *) m_control; }
 | |
|     wxDECLARE_NO_COPY_CLASS(GridCellTextEditor);
 | |
| 
 | |
| private:
 | |
|     wxString m_value;
 | |
| };
 | |
| 
 | |
| 
 | |
| class  GridCellFilamentsEditor : public wxGridCellChoiceEditor
 | |
| {
 | |
| public:
 | |
|     GridCellFilamentsEditor(size_t count = 0,
 | |
|                            const wxString choices[] = NULL,
 | |
|                            bool allowOthers = false,
 | |
|                            std::vector<wxBitmap*>* bitmaps = NULL);
 | |
|     GridCellFilamentsEditor(const wxArrayString& choices,
 | |
|                            bool allowOthers = false,
 | |
|                            std::vector<wxBitmap*>* bitmaps = NULL);
 | |
| 
 | |
|     virtual void Create(wxWindow* parent,
 | |
|                         wxWindowID id,
 | |
|                         wxEvtHandler* evtHandler) wxOVERRIDE;
 | |
|     virtual void SetSize(const wxRect& rect) wxOVERRIDE;
 | |
| 
 | |
|     virtual wxGridCellEditor *Clone() const wxOVERRIDE;
 | |
| 
 | |
|     virtual void BeginEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
 | |
|     virtual bool EndEdit(int row, int col, const wxGrid* grid,
 | |
|                          const wxString& oldval, wxString *newval) wxOVERRIDE;
 | |
| 
 | |
|     virtual wxGridActivationResult TryActivate(int row, int col, wxGrid* grid, const wxGridActivationSource& actSource) wxOVERRIDE;
 | |
|     virtual void DoActivate(int row, int col, wxGrid* grid) wxOVERRIDE;
 | |
| 
 | |
| protected:
 | |
|     ::ComboBox *Combo() const { return (::ComboBox *)m_control; }
 | |
|     void OnComboCloseUp(wxCommandEvent& evt);
 | |
| 
 | |
|     std::vector<wxBitmap*>* m_icons;
 | |
| 
 | |
|     wxDECLARE_NO_COPY_CLASS(GridCellFilamentsEditor);
 | |
| private:
 | |
|     int m_cached_value {-1};
 | |
| };
 | |
| 
 | |
| 
 | |
| class GridCellFilamentsRenderer : public wxGridCellChoiceRenderer
 | |
| {
 | |
| public:
 | |
|     virtual void Draw(wxGrid& grid,
 | |
|                       wxGridCellAttr& attr,
 | |
|                       wxDC& dc,
 | |
|                       const wxRect& rect,
 | |
|                       int row, int col,
 | |
|                       bool isSelected) wxOVERRIDE;
 | |
| 
 | |
|     virtual wxSize GetBestSize(wxGrid& WXUNUSED(grid),
 | |
|                                wxGridCellAttr& attr,
 | |
|                                wxDC& dc,
 | |
|                                int WXUNUSED(row),
 | |
|                                int WXUNUSED(col)) wxOVERRIDE;
 | |
| 
 | |
|     virtual GridCellFilamentsRenderer *Clone() const wxOVERRIDE;
 | |
| };
 | |
| 
 | |
| 
 | |
| class GridCellChoiceEditor : public wxGridCellChoiceEditor
 | |
| {
 | |
| public:
 | |
|     GridCellChoiceEditor(size_t count = 0, const wxString choices[] = NULL);
 | |
|     GridCellChoiceEditor(const wxArrayString &choices);
 | |
| 
 | |
|     virtual void Create(wxWindow *parent, wxWindowID id, wxEvtHandler *evtHandler) wxOVERRIDE;
 | |
|     virtual void SetSize(const wxRect &rect) wxOVERRIDE;
 | |
| 
 | |
|     virtual wxGridCellEditor *Clone() const wxOVERRIDE;
 | |
| 
 | |
|     virtual void BeginEdit(int row, int col, wxGrid *grid) wxOVERRIDE;
 | |
|     virtual bool EndEdit(int row, int col, const wxGrid *grid, const wxString &oldval, wxString *newval) wxOVERRIDE;
 | |
| 
 | |
|     virtual wxGridActivationResult TryActivate(int row, int col, wxGrid *grid, const wxGridActivationSource &actSource) wxOVERRIDE;
 | |
|     virtual void                   DoActivate(int row, int col, wxGrid *grid) wxOVERRIDE;
 | |
| 
 | |
| protected:
 | |
|     ::ComboBox *Combo() const { return (::ComboBox *) m_control; }
 | |
|     void        OnComboCloseUp(wxCommandEvent &evt);
 | |
|     wxDECLARE_NO_COPY_CLASS(GridCellChoiceEditor);
 | |
| 
 | |
| private:
 | |
|     int m_cached_value{-1};
 | |
| };
 | |
| 
 | |
| 
 | |
| class GridCellComboBoxRenderer : public wxGridCellChoiceRenderer
 | |
| {
 | |
| public:
 | |
|     virtual void Draw(wxGrid &grid, wxGridCellAttr &attr, wxDC &dc, const wxRect &rect, int row, int col, bool isSelected) wxOVERRIDE;
 | |
| 
 | |
|     virtual wxSize GetBestSize(wxGrid &WXUNUSED(grid), wxGridCellAttr &attr, wxDC &dc, int WXUNUSED(row), int WXUNUSED(col)) wxOVERRIDE;
 | |
| 
 | |
|     virtual GridCellComboBoxRenderer *Clone() const wxOVERRIDE;
 | |
| };
 | |
| 
 | |
| class GridCellSupportEditor : public wxGridCellBoolEditor
 | |
| {
 | |
| public:
 | |
|     GridCellSupportEditor() { }
 | |
|     virtual void DoActivate(int row, int col, wxGrid* grid) wxOVERRIDE;
 | |
| 
 | |
| private:
 | |
|     void SetValueFromGrid(int row, int col, wxGrid* grid);
 | |
|     void SetGridFromValue(int row, int col, wxGrid* grid) const;
 | |
| 
 | |
|     wxString GetStringValue() const { return GetStringValue(m_value); }
 | |
| 
 | |
|     static
 | |
|     wxString GetStringValue(bool value) { return ms_stringValues[value]; }
 | |
| 
 | |
|     bool m_value;
 | |
| 
 | |
|     static wxString ms_stringValues[2];
 | |
| 
 | |
|     wxDECLARE_NO_COPY_CLASS(GridCellSupportEditor);
 | |
| };
 | |
| 
 | |
| class GridCellSupportRenderer : public wxGridCellBoolRenderer
 | |
| {
 | |
| public:
 | |
|     virtual void Draw(wxGrid& grid,
 | |
|                       wxGridCellAttr& attr,
 | |
|                       wxDC& dc,
 | |
|                       const wxRect& rect,
 | |
|                       int row, int col,
 | |
|                       bool isSelected) wxOVERRIDE;
 | |
| 
 | |
|     virtual wxSize GetBestSize(wxGrid& WXUNUSED(grid),
 | |
|                                wxGridCellAttr& attr,
 | |
|                                wxDC& dc,
 | |
|                                int WXUNUSED(row),
 | |
|                                int WXUNUSED(col)) wxOVERRIDE;
 | |
| 
 | |
|     virtual GridCellSupportRenderer *Clone() const wxOVERRIDE;
 | |
| };
 | |
| 
 | |
| 
 | |
| //ObjectGrid for the param setting table
 | |
| class ObjectGrid : public wxGrid
 | |
| {
 | |
| public:
 | |
|     ObjectGrid(wxWindow *parent,
 | |
|         wxWindowID id,
 | |
|         const wxPoint& pos = wxDefaultPosition,
 | |
|         const wxSize& size = wxDefaultSize,
 | |
|         long style = wxWANTS_CHARS,
 | |
|         const wxString& name = wxASCII_STR(wxGridNameStr))
 | |
|         :wxGrid(parent, id, pos, size, style, name)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     ~ObjectGrid() {}
 | |
| 
 | |
|     /*virtual wxPen GetColGridLinePen(int col)
 | |
|     {
 | |
|         if (col % 2 == 1)
 | |
|             return wxPen(*wxBLUE, 2, wxPENSTYLE_SOLID);
 | |
|         else
 | |
|             return *wxTRANSPARENT_PEN;
 | |
|     }
 | |
| 
 | |
|     virtual wxPen GetRowGridLinePen(int row)
 | |
|     {
 | |
|         return wxNullPen;
 | |
|     }*/
 | |
| 
 | |
|     bool OnCellLeftClick(wxGridEvent& event, int row, int col, ConfigOptionType type);
 | |
|     void OnRangeSelected(wxGridRangeSelectEvent& ev);
 | |
|     void OnColHeadLeftClick(wxGridEvent& event);
 | |
| 
 | |
|     virtual void DrawColLabels( wxDC& dc, const wxArrayInt& cols );
 | |
|     virtual void DrawColLabel( wxDC& dc, int col );
 | |
| 
 | |
|     //set ObjectGridTable and ObjectTablePanel as friend
 | |
|     friend class     ObjectGridTable;
 | |
|     friend class     ObjectTablePanel;
 | |
| 
 | |
|     wxString  input_string;
 | |
| 	wxString  m_cell_data;
 | |
| protected:
 | |
|     //void OnSize( wxSizeEvent& );
 | |
|     void OnKeyDown( wxKeyEvent& );
 | |
|     void OnKeyUp( wxKeyEvent& );
 | |
|     void OnChar( wxKeyEvent& );
 | |
| 
 | |
| private:
 | |
|     wxDECLARE_EVENT_TABLE();
 | |
|     wxGridBlockCoords   m_selected_block;
 | |
|     void paste_data( wxTextDataObject& text_data );
 | |
| };
 | |
| 
 | |
| class ObjectGridTable : public wxGridTableBase
 | |
| {
 | |
| public:
 | |
|     static std::string category_all;
 | |
|     static std::string plate_outside;
 | |
|     enum GridRowType
 | |
|     {
 | |
|         row_object = 0,
 | |
|         row_volume = 1
 | |
|     };
 | |
|     enum GridColType
 | |
|     {
 | |
|       /*  col_plate_index = 0,
 | |
|         col_assemble_name = 1,
 | |
|         col_name = col_assemble_name + 1,
 | |
|         col_printable = col_name + 1,
 | |
|         col_printable_reset = col_printable + 1,
 | |
|         col_filaments = col_printable_reset + 1,
 | |
|         col_filaments_reset = col_filaments + 1,
 | |
|         col_layer_height = col_filaments_reset + 1,
 | |
|         col_layer_height_reset = col_layer_height + 1,
 | |
|         col_wall_loops = col_layer_height_reset + 1,
 | |
|         col_wall_loops_reset = col_wall_loops + 1,
 | |
|         col_fill_density = col_wall_loops_reset + 1,
 | |
|         col_fill_density_reset = col_fill_density + 1,
 | |
|         col_enable_support = col_fill_density_reset + 1,
 | |
|         col_enable_support_reset = col_enable_support + 1,
 | |
|         col_brim_type = col_enable_support_reset + 1,
 | |
|         col_brim_type_reset = col_brim_type + 1,
 | |
|         col_speed_perimeter = col_brim_type_reset + 1,
 | |
|         col_speed_perimeter_reset = col_speed_perimeter + 1,
 | |
|         col_max*/
 | |
|         col_printable             = 0,
 | |
|         col_printable_reset       = 1,
 | |
|         col_plate_index           = 2,
 | |
|         //col_assemble_name         = 3,
 | |
|         col_name                  = 3,
 | |
|         col_filaments             = 4,
 | |
|         col_filaments_reset       = 5,
 | |
|         col_layer_height          = 6,
 | |
|         col_layer_height_reset    = 7,
 | |
|         col_wall_loops            = 8,
 | |
|         col_wall_loops_reset      = 9,
 | |
|         col_fill_density          = 10,
 | |
|         col_fill_density_reset    = 11,
 | |
|         col_enable_support        = 12,
 | |
|         col_enable_support_reset  = 13,
 | |
|         col_brim_type             = 14,
 | |
|         col_brim_type_reset       = 15,
 | |
|         col_speed_perimeter       = 16,
 | |
|         col_speed_perimeter_reset = 17,
 | |
|         col_max
 | |
|     };
 | |
| 
 | |
|     struct ObjectGridRow
 | |
|     {
 | |
|         int                         object_id;
 | |
|         int                         volume_id;
 | |
|         GridRowType                 row_type;
 | |
|         ConfigOptionString          plate_index;
 | |
|         //ConfigOptionString          assemble_name;
 | |
|         //ConfigOptionString          ori_assemble_name;
 | |
|         ConfigOptionString          name;
 | |
|         ConfigOptionString          ori_name;
 | |
|         ConfigOptionBool            printable;
 | |
|         ConfigOptionBool            ori_printable;
 | |
|         ConfigOptionInt             filaments;
 | |
|         ConfigOptionInt             ori_filaments;
 | |
|         ConfigOptionFloat           layer_height;
 | |
|         ConfigOptionFloat           ori_layer_height;
 | |
|         ConfigOptionInt             wall_loops;
 | |
|         ConfigOptionInt             ori_wall_loops;
 | |
|         ConfigOptionPercent         sparse_infill_density;
 | |
|         ConfigOptionPercent         ori_fill_density;
 | |
|         ConfigOptionBool            enable_support;
 | |
|         ConfigOptionBool            ori_enable_support;
 | |
|         ConfigOptionEnum<BrimType>  brim_type;
 | |
|         ConfigOptionEnum<BrimType>  ori_brim_type;
 | |
|         ConfigOptionFloat           speed_perimeter;
 | |
|         ConfigOptionFloat           ori_speed_perimeter;
 | |
| 
 | |
|         ModelConfig*                config;
 | |
| 
 | |
|         ObjectGridRow(int obj_id, int vol_id, GridRowType type)
 | |
|             : object_id(obj_id), volume_id(vol_id), row_type(type)
 | |
|         {
 | |
|             config = nullptr;
 | |
|         }
 | |
| 
 | |
|         ConfigOption& operator[](GridColType idx)
 | |
|         {
 | |
|             switch(idx)
 | |
|             {
 | |
|                 case col_plate_index:
 | |
|                     return plate_index;
 | |
|             /*case col_assemble_name:
 | |
|                 return assemble_name;*/
 | |
|                 case col_name:
 | |
|                     return name;
 | |
|                 case col_printable:
 | |
|                     return printable;
 | |
|                 case col_printable_reset:
 | |
|                     return ori_printable;
 | |
|                 case col_filaments:
 | |
|                     return filaments;
 | |
|                 case col_filaments_reset:
 | |
|                     return ori_filaments;
 | |
|                 case col_layer_height:
 | |
|                     return layer_height;
 | |
|                 case col_layer_height_reset:
 | |
|                     return ori_layer_height;
 | |
|                 case col_wall_loops:
 | |
|                     return wall_loops;
 | |
|                 case col_wall_loops_reset:
 | |
|                     return ori_wall_loops;
 | |
|                 case col_fill_density:
 | |
|                     return sparse_infill_density;
 | |
|                 case col_fill_density_reset:
 | |
|                     return ori_fill_density;
 | |
|                 case col_enable_support:
 | |
|                     return enable_support;
 | |
|                 case col_enable_support_reset:
 | |
|                     return ori_enable_support;
 | |
|                 case col_brim_type:
 | |
|                     return brim_type;
 | |
|                 case col_brim_type_reset:
 | |
|                     return ori_brim_type;
 | |
|                 case col_speed_perimeter:
 | |
|                     return speed_perimeter;
 | |
|                 case col_speed_perimeter_reset:
 | |
|                     return ori_speed_perimeter;
 | |
|                 default:
 | |
|                     break;
 | |
|             }
 | |
|             return name;
 | |
|         }
 | |
|     };
 | |
|     typedef std::function<bool(ObjectGridRow* row1, ObjectGridRow* row2)> compare_row_func;
 | |
| 
 | |
|     struct ObjectGridCol
 | |
|     {
 | |
|         int                  size;
 | |
|         ConfigOptionType     type;
 | |
|         std::string          key;
 | |
|         std::string          category;
 | |
|         bool                 b_for_object;
 | |
|         bool                 b_icon;
 | |
|         bool                 b_editable;
 | |
|         bool                 b_from_config;
 | |
|         wxString             *choices;
 | |
|         int                  choice_count;
 | |
|         int                  horizontal_align;
 | |
| 
 | |
|         ObjectGridCol(ConfigOptionType option_type, std::string key_str, std::string cat, bool only_object, bool icon, bool edit, bool config, int ho_align)
 | |
|             : type(option_type), key(key_str), category(cat), b_for_object(only_object), b_icon(icon), b_editable(edit), b_from_config(config), horizontal_align(ho_align)
 | |
|         {
 | |
|             if (b_icon)
 | |
|                 size = 32;
 | |
|             else
 | |
|                 size = -1;
 | |
|             choices = nullptr;
 | |
|             choice_count = 0;
 | |
|         }
 | |
| 
 | |
|         ~ObjectGridCol()
 | |
|         {
 | |
|             choices = nullptr;
 | |
|         }
 | |
|     };
 | |
|     ObjectGridTable(ObjectTablePanel* panel): m_panel(panel) { }
 | |
|     ~ObjectGridTable();
 | |
| 
 | |
|     void release_object_configs();
 | |
|     wxString convert_filament_string(int index, wxString& filament_str);
 | |
| 
 | |
|     virtual int GetNumberRows() wxOVERRIDE;
 | |
|     virtual int GetNumberCols() wxOVERRIDE;
 | |
|     virtual bool IsEmptyCell( int row, int col ) wxOVERRIDE;
 | |
| 
 | |
| 
 | |
|     //virtual wxString GetColLabelValue( int col ) wxOVERRIDE;
 | |
| 
 | |
|     virtual wxString GetTypeName( int row, int col ) wxOVERRIDE;
 | |
|     virtual bool CanGetValueAs( int row, int col, const wxString& typeName ) wxOVERRIDE;
 | |
|     virtual bool CanSetValueAs( int row, int col, const wxString& typeName ) wxOVERRIDE;
 | |
| 
 | |
|     virtual wxString GetValue( int row, int col ) wxOVERRIDE;
 | |
|     virtual void SetValue( int row, int col, const wxString& value ) wxOVERRIDE;
 | |
| 
 | |
|     virtual long GetValueAsLong( int row, int col ) wxOVERRIDE;
 | |
|     virtual bool GetValueAsBool( int row, int col ) wxOVERRIDE;
 | |
|     virtual double GetValueAsDouble (int row, int col) wxOVERRIDE;
 | |
| 
 | |
|     virtual void SetValueAsLong( int row, int col, long value ) wxOVERRIDE;
 | |
|     virtual void SetValueAsBool( int row, int col, bool value ) wxOVERRIDE;
 | |
|     virtual void SetValueAsDouble (int row, int col, double value) wxOVERRIDE;
 | |
| 
 | |
|     void SetColLabelValue( int col, const wxString& ) wxOVERRIDE;
 | |
|     wxString GetColLabelValue( int col ) wxOVERRIDE;
 | |
| 
 | |
|     template<typename TYPE> const TYPE* get_object_config_value(const DynamicPrintConfig& global_config, ModelConfig* obj_config, std::string& config_option)
 | |
|     {
 | |
|         if (obj_config->has(config_option))
 | |
|             return static_cast<const TYPE*>(obj_config->option(config_option));
 | |
|         else {
 | |
|             const TYPE* ptr = global_config.option<TYPE>(config_option);
 | |
|             //todo: how to deal with nullptr
 | |
|             return ptr;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     template<typename TYPE> const TYPE* get_volume_config_value(const DynamicPrintConfig& global_config, ModelConfig* obj_config, ModelConfig* volume_config, std::string& config_option)
 | |
|     {
 | |
|         if (volume_config->has(config_option))
 | |
|             return static_cast<const TYPE*>(volume_config->option(config_option));
 | |
|         else if (obj_config->has(config_option))
 | |
|             return static_cast<const TYPE*>(obj_config->option(config_option));
 | |
|         else {
 | |
|             const TYPE* ptr = global_config.option<TYPE>(config_option);
 | |
|             //todo: how to deal with nullptr
 | |
|             return ptr;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     int get_row_count() { return m_grid_data.size() + 1; }
 | |
|     int get_col_count() { return m_col_data.size(); }
 | |
|     ObjectGridCol* get_grid_col(int col) { return m_col_data[col]; }
 | |
|     ObjectGridRow* get_grid_row(int row) { return m_grid_data[row]; }
 | |
|     void           construct_object_configs(ObjectGrid* object_grid);
 | |
|     void update_value_to_config(ModelConfig* config, std::string& key, ConfigOption& new_value,  ConfigOption& ori_value);
 | |
|     void update_filament_to_config(ModelConfig* config, std::string& key, ConfigOption& new_value,  ConfigOption& ori_value, bool is_object);
 | |
|     void update_volume_values_from_object(int row, int col);
 | |
|     void update_value_to_object(Model* model, ObjectGridRow* grid_row, int col);
 | |
|     wxBitmap& get_undo_bitmap(bool selected = false);
 | |
|     wxBitmap* get_color_bitmap(int color_index);
 | |
|     bool OnCellLeftClick(int row, int col, ConfigOptionType &type);
 | |
|     void OnSelectCell(int row, int col);
 | |
|     void OnRangeSelected(int row, int col, int row_count, int col_count);
 | |
|     //void OnRangeSelecting( wxGridRangeSelectEvent& );
 | |
|     //void OnCellValueChanging( wxGridEvent& );
 | |
|     void OnCellValueChanged(int row, int col);
 | |
|     //set the selection by object id and volume id
 | |
|     void SetSelection(int object_id, int volume_id);
 | |
|     //sort the table row datas by default
 | |
|     void sort_by_default();
 | |
|     void sort_by_col(int col);
 | |
| 
 | |
|     //reload data caused by settings in the side window
 | |
|     void reload_object_data(ObjectGridRow* grid_row, const std::string& category, DynamicPrintConfig&  global_config);
 | |
|     void reload_part_data(ObjectGridRow* volume_row, ObjectGridRow* object_row, const std::string& category, DynamicPrintConfig&  global_config);
 | |
|     void reload_cell_data(int row, const std::string& category);
 | |
|     void resetValuesInCurrentCell(wxEvent& WXUNUSED(event));
 | |
|     void enable_reset_all_button(bool enable);
 | |
| 
 | |
|     int m_icon_col_width{ 0 };
 | |
|     int m_icon_row_height{ 0 };
 | |
|     ObjectTablePanel* m_panel{ nullptr };
 | |
| 
 | |
| private:
 | |
|     std::vector<ObjectGridRow*> m_grid_data;
 | |
|     std::vector<ObjectGridCol*> m_col_data;
 | |
|     bool m_data_valid{false};
 | |
| 
 | |
|     std::list<wxGridCellCoords> m_selected_cells;
 | |
| 
 | |
|     int m_sort_col{ -1 };
 | |
| 
 | |
|     void init_cols(ObjectGrid *object_grid);
 | |
|     //generic function for sort row datas
 | |
|     void sort_row_data(compare_row_func sort_func);
 | |
|     //update the row properties for the data has been sorted
 | |
|     void update_row_properties();
 | |
|     int m_current_row {-1};
 | |
|     int m_current_col {-1};
 | |
| 
 | |
|     wxArrayString     m_colLabels;
 | |
| };
 | |
| 
 | |
| 
 | |
| //the main panel
 | |
| class ObjectTablePanel : public wxPanel
 | |
| {
 | |
| public:
 | |
| 	int range_select_left_col;
 | |
| 	int range_select_right_col;
 | |
| 	int range_select_top_row;
 | |
| 	int range_select_bottom_row;
 | |
| 
 | |
|     void OnCellLeftClick( wxGridEvent& );
 | |
|     void OnRowSize( wxGridSizeEvent& );
 | |
|     void OnColSize( wxGridSizeEvent& );
 | |
|     void OnSelectCell( wxGridEvent& );
 | |
|     void OnRangeSelected( wxGridRangeSelectEvent& );
 | |
|     //void OnRangeSelecting( wxGridRangeSelectEvent& );
 | |
|     //void OnCellValueChanging( wxGridEvent& );
 | |
|     void OnCellValueChanged( wxGridEvent& );
 | |
|     //void OnCellBeginDrag( wxGridEvent& );
 | |
| public:
 | |
|     ObjectTablePanel( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name, Plater* platerObj, Model *modelObj );
 | |
|     ~ObjectTablePanel();
 | |
| 
 | |
|     void load_data();
 | |
|     void SetSelection(int object_id, int volume_id);
 | |
|     void sort_by_default() { m_object_grid_table->sort_by_default(); }
 | |
|     wxSize get_init_size();
 | |
|     void resetAllValuesInSideWindow(int row, bool is_object, ModelObject* object, ModelConfig* config, const std::string& category);
 | |
| 
 | |
|     //set ObjectGridTable as friend
 | |
|     friend class     ObjectGridTable;
 | |
| 
 | |
|     std::vector<wxString> m_filaments_name;
 | |
|     std::vector<wxColour> m_filaments_colors;
 | |
|     int m_filaments_count{ 1 };
 | |
|     void set_default_filaments_and_colors()
 | |
|     {
 | |
|         m_filaments_count = 1;
 | |
|         m_filaments_colors.push_back(*wxGREEN);
 | |
|         m_filaments_name.push_back("Generic PLA");
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     wxColour            m_bg_colour;
 | |
|     wxColour            m_hover_colour;
 | |
|     wxBoxSizer*         m_top_sizer{nullptr};
 | |
|     wxBoxSizer*         m_page_sizer{nullptr};
 | |
|     wxBoxSizer*         m_page_top_sizer{nullptr};
 | |
|     wxTextCtrl*         m_search_line{ nullptr };
 | |
|     ObjectGrid*         m_object_grid{nullptr};
 | |
|     ObjectGridTable*    m_object_grid_table{nullptr};
 | |
|     wxStaticText*       m_page_text{nullptr};
 | |
|     ScalableButton*     m_global_reset{nullptr};
 | |
|     wxScrolledWindow*   m_side_window{nullptr};
 | |
|     ObjectTableSettings* m_object_settings{ nullptr };
 | |
|     Model*              m_model{nullptr};
 | |
|     ModelConfig*        m_config {nullptr};
 | |
|     Plater*             m_plater{nullptr};
 | |
| 
 | |
|     int                 m_cur_row { -1 };
 | |
|     int                 m_cur_col { -1 };
 | |
| 
 | |
|     int init_bitmap();
 | |
|     int init_filaments_and_colors();
 | |
| 
 | |
|     wxFloatingPointValidator<float> m_float_validator;
 | |
|     wxBitmap           m_undo_bitmap;
 | |
|     std::vector<wxBitmap*> m_color_bitmaps;
 | |
|     ScalableBitmap     m_bmp_reset;
 | |
|     ScalableBitmap     m_bmp_reset_disable;
 | |
| private:
 | |
|     wxDECLARE_ABSTRACT_CLASS(ObjectGrid);
 | |
|     wxDECLARE_EVENT_TABLE();
 | |
| };
 | |
| 
 | |
| class ObjectTableDialog : public GUI::DPIDialog
 | |
| {
 | |
|     const int POPUP_WIDTH   = FromDIP(512);
 | |
|     const int POPUP_HEIGHT  = FromDIP(1024);
 | |
| 
 | |
|     //wxPanel*             m_panel{ nullptr };
 | |
|     wxBoxSizer*          m_top_sizer{ nullptr };
 | |
|     wxStaticText*        m_static_title{ nullptr };
 | |
|     //wxTimer*             m_refresh_timer;
 | |
|     ObjectTablePanel*    m_obj_panel{ nullptr };
 | |
|     Model*               m_model{ nullptr };
 | |
|     Plater*              m_plater{ nullptr };
 | |
| 
 | |
| 
 | |
| public:
 | |
|     ObjectTableDialog(wxWindow* parent, Plater* platerObj, Model *modelObj, wxSize maxSize);
 | |
|     ~ObjectTableDialog();
 | |
|     void Popup(int obj_idx = -1, int vol_idx = -1, wxPoint position = wxDefaultPosition);
 | |
|     void OnClose(wxCloseEvent &evt);
 | |
|     void OnText(wxKeyEvent &evt);
 | |
|     void OnSize(wxSizeEvent& event);
 | |
| 
 | |
| protected:
 | |
|     void on_dpi_changed(const wxRect& suggested_rect) override;
 | |
|     void on_sys_color_changed() override;
 | |
| };
 | |
| 
 | |
| }
 | |
| }
 | |
| #endif //slic3r_GUI_ObjectTable_hpp_
 |