#ifndef slic3r_GUI_ObjectList_hpp_ #define slic3r_GUI_ObjectList_hpp_ #include #include #include #include #include "Event.hpp" class wxBoxSizer; class PrusaObjectDataViewModel; namespace Slic3r { class ConfigOptionsGroup; class DynamicPrintConfig; class ModelObject; class ModelVolume; namespace GUI { wxDECLARE_EVENT(EVT_OBJ_LIST_OBJECT_SELECT, SimpleEvent); class ObjectList : public wxDataViewCtrl { wxBoxSizer *m_sizer {nullptr}; DynamicPrintConfig *m_default_config {nullptr}; wxBitmap m_bmp_modifiermesh; wxBitmap m_bmp_solidmesh; wxBitmap m_bmp_manifold_warning; wxBitmap m_bmp_cog; wxBitmap m_bmp_split; int m_selected_object_id = -1; bool m_prevent_list_events = false; // We use this flag to avoid circular event handling Select() // happens to fire a wxEVT_LIST_ITEM_SELECTED on OSX, whose event handler // calls this method again and again and again #ifdef __WXOSX__ wxString m_selected_extruder = ""; #endif //__WXOSX__ bool m_parts_changed = false; bool m_part_settings_changed = false; public: ObjectList(wxWindow* parent); ~ObjectList(); std::map CATEGORY_ICON; PrusaObjectDataViewModel *m_objects_model{ nullptr }; DynamicPrintConfig *m_config {nullptr}; std::vector *m_objects{ nullptr }; void create_objects_ctrl(); wxDataViewColumn* create_objects_list_extruder_column(int extruders_count); void update_objects_list_extruder_column(int extruders_count); // show/hide "Extruder" column for Objects List void set_extruder_column_hidden(bool hide); // update extruder in current config void update_extruder_in_config(const wxString& selection); void init_icons(); void set_tooltip_for_item(const wxPoint& pt); void selection_changed(); void context_menu(); void show_context_menu(); void key_event(wxKeyEvent& event); void item_value_change(wxDataViewEvent& event); void on_begin_drag(wxDataViewEvent &event); void on_drop_possible(wxDataViewEvent &event); void on_drop(wxDataViewEvent &event); void get_settings_choice(wxMenu *menu, int id, bool is_part); void menu_item_add_generic(wxMenuItem* &menu, int id); wxMenuItem* menu_item_split(wxMenu* menu, int id); wxMenuItem* menu_item_settings(wxMenu* menu, int id, const bool is_part); wxMenu* create_add_part_popupmenu(); wxMenu* create_part_settings_popupmenu(); wxMenu* create_add_settings_popupmenu(bool is_part); void load_subobject(bool is_modifier = false, bool is_lambda = false); void load_part(ModelObject* model_object, wxArrayString& part_names, const bool is_modifier); void load_lambda(ModelObject* model_object, wxArrayString& part_names, const bool is_modifier); void load_lambda(const std::string& type_name); void del_subobject_item(wxDataViewItem& item); void del_settings_from_config(); void del_instances_from_object(const int obj_idx); bool del_subobject_from_object(const int obj_idx, const int idx, const int type); void split(const bool split_part); bool get_volume_by_item(const bool split_part, const wxDataViewItem& item, ModelVolume*& volume); bool is_splittable_object(const bool split_part); wxPoint get_mouse_position_in_control(); wxBoxSizer* get_sizer() {return m_sizer;} int get_selected_obj_idx() const; bool is_parts_changed() const { return m_parts_changed; } bool is_part_settings_changed() const { return m_part_settings_changed; } void part_settings_changed(); void parts_changed(int obj_idx); void part_selection_changed(); void update_manipulation_sizer(const bool is_simple_mode); // Add object to the list void add_object_to_list(size_t obj_idx); // Delete object from the list void delete_object_from_list(); void delete_object_from_list(const size_t obj_idx); void delete_volume_from_list(const size_t obj_idx, const size_t vol_idx); // Delete all objects from the list void delete_all_objects_from_list(); // Increase instances count void increase_object_instances(const size_t obj_idx, const size_t num); // Decrease instances count void decrease_object_instances(const size_t obj_idx, const size_t num); // #ys_FIXME_to_delete // Unselect all objects in the list on c++ side void unselect_objects(); // Select current object in the list on c++ side void select_current_object(int idx); // Select current volume in the list on c++ side void select_current_volume(int idx, int vol_idx); // Remove objects/sub-object from the list void remove(); void init_objects(); bool multiple_selection() const ; void update_selections(); void update_selections_on_canvas(); void select_item(const wxDataViewItem& item); void select_items(const wxDataViewItemArray& sels); void select_all(); // correct current selections to avoid of the possible conflicts void fix_multiselection_conflicts(); }; }} #endif //slic3r_GUI_ObjectList_hpp_