#ifndef slic3r_EditGCodeDialog_hpp_ #define slic3r_EditGCodeDialog_hpp_ #include #include #include #include "GUI_Utils.hpp" #include "wxExtensions.hpp" #include "libslic3r/Preset.hpp" #include "libslic3r/PrintConfig.hpp" class wxListBox; class wxTextCtrl; class ScalableButton; namespace Slic3r { namespace GUI { class ParamsViewCtrl; //------------------------------------------ // EditGCodeDialog //------------------------------------------ class EditGCodeDialog : public DPIDialog { ParamsViewCtrl* m_params_list {nullptr}; ScalableButton* m_add_btn {nullptr}; wxTextCtrl* m_gcode_editor {nullptr}; wxStaticText* m_param_label {nullptr}; wxStaticText* m_param_description {nullptr}; ReadOnlySlicingStatesConfigDef cgp_ro_slicing_states_config_def; ReadWriteSlicingStatesConfigDef cgp_rw_slicing_states_config_def; OtherSlicingStatesConfigDef cgp_other_slicing_states_config_def; PrintStatisticsConfigDef cgp_print_statistics_config_def; ObjectsInfoConfigDef cgp_objects_info_config_def; DimensionsConfigDef cgp_dimensions_config_def; TemperaturesConfigDef cgp_temperatures_config_def; TimestampsConfigDef cgp_timestamps_config_def; OtherPresetsConfigDef cgp_other_presets_config_def; public: EditGCodeDialog(wxWindow*parent, const std::string&key, const std::string&value); ~EditGCodeDialog(); std::string get_edited_gcode() const; void init_params_list(const std::string& custom_gcode_name); wxDataViewItem add_presets_placeholders(); void add_selected_value_to_gcode(); void bind_list_and_button(); protected: std::unordered_map m_button_list; void on_dpi_changed(const wxRect& suggested_rect) override; void on_sys_color_changed() override; void selection_changed(wxDataViewEvent& evt); wxBoxSizer* create_btn_sizer(long flags); }; // ---------------------------------------------------------------------------- // ParamsModelNode: a node inside ParamsModel // ---------------------------------------------------------------------------- class ParamsNode; using ParamsNodePtrArray = std::vector>; enum class ParamType { Undef, Scalar, Vector, FilamentVector, }; // On all of 3 different platforms Bitmap+Text icon column looks different // because of Markup text is missed or not implemented. // As a temporary workaround, we will use: // MSW - DataViewBitmapText (our custom renderer wxBitmap + wxString, supported Markup text) // OSX - -//-, but Markup text is not implemented right now // GTK - wxDataViewIconText (wxWidgets for GTK renderer wxIcon + wxString, supported Markup text) class ParamsNode { ParamsNode* m_parent{ nullptr }; ParamsNodePtrArray m_children; ParamType m_param_type{ ParamType::Undef }; // TODO/FIXME: // the GTK version of wxDVC (in particular wxDataViewCtrlInternal::ItemAdded) // needs to know in advance if a node is or _will be_ a container. // Thus implementing: // bool IsContainer() const // { return m_children.size()>0; } // doesn't work with wxGTK when DiffModel::AddToClassical is called // AND the classical node was removed (a new node temporary without children // would be added to the control) bool m_container{ true }; public: #ifdef __linux__ wxIcon icon; #else wxBitmap icon; #endif //__linux__ std::string icon_name; std::string param_key; wxString text; // Group params(root) node ParamsNode(const wxString& group_name, const std::string& icon_name); // sub SlicingState node ParamsNode(ParamsNode* parent, const wxString& sub_group_name, const std::string& icon_name); // parametre node ParamsNode( ParamsNode* parent, ParamType param_type, const std::string& param_key); bool IsContainer() const { return m_container; } bool IsGroupNode() const { return m_parent == nullptr; } bool IsParamNode() const { return m_param_type != ParamType::Undef; } void SetContainer(bool is_container) { m_container = is_container; } ParamsNode* GetParent() { return m_parent; } ParamsNodePtrArray& GetChildren() { return m_children; } void Append(std::unique_ptr child) { m_children.emplace_back(std::move(child)); } }; // ---------------------------------------------------------------------------- // ParamsModel // ---------------------------------------------------------------------------- class ParamsModel : public wxDataViewModel { ParamsNodePtrArray m_group_nodes; wxDataViewCtrl* m_ctrl{ nullptr }; public: ParamsModel(); ~ParamsModel() override = default; void SetAssociatedControl(wxDataViewCtrl* ctrl) { m_ctrl = ctrl; } wxDataViewItem AppendGroup(const wxString& group_name, const std::string& icon_name); wxDataViewItem AppendSubGroup(wxDataViewItem parent, const wxString& sub_group_name, const std::string&icon_name); wxDataViewItem AppendParam( wxDataViewItem parent, ParamType param_type, const std::string& param_key); wxDataViewItem Delete(const wxDataViewItem& item); wxString GetParamName(wxDataViewItem item); std::string GetParamKey(wxDataViewItem item); std::string GetTopLevelCategory(wxDataViewItem item); void Clear(); wxDataViewItem GetParent(const wxDataViewItem& item) const override; unsigned int GetChildren(const wxDataViewItem& parent, wxDataViewItemArray& array) const override; unsigned int GetColumnCount() const override; wxString GetColumnType(unsigned int col) const override; void GetValue(wxVariant& variant, const wxDataViewItem& item, unsigned int col) const override; bool SetValue(const wxVariant& variant, const wxDataViewItem& item, unsigned int col) override; bool IsContainer(const wxDataViewItem& item) const override; // Is the container just a header or an item with all columns // In our case it is an item with all columns bool HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const override { return true; } }; // ---------------------------------------------------------------------------- // ParamsViewCtrl // ---------------------------------------------------------------------------- class ParamsViewCtrl : public wxDataViewCtrl { int m_em_unit; public: ParamsViewCtrl(wxWindow* parent, wxSize size); ~ParamsViewCtrl() override { if (model) { Clear(); model->DecRef(); } } ParamsModel* model{ nullptr }; wxDataViewItem AppendGroup(const wxString& group_name, const std::string& icon_name); wxDataViewItem AppendSubGroup(wxDataViewItem parent, const wxString& sub_group_name, const std::string&icon_name); wxDataViewItem AppendParam( wxDataViewItem parent, ParamType param_type, const std::string& param_key); wxString GetValue(wxDataViewItem item); wxString GetSelectedValue(); std::string GetSelectedParamKey(); std::string GetSelectedTopLevelCategory(); void CheckAndDeleteIfEmpty(wxDataViewItem item); void Clear(); void Rescale(int em = 0); void set_em_unit(int em) { m_em_unit = em; } }; static std::string unbold(const std::string& text) { return text.substr(text.find("")+3, text.find("")-3); } } // namespace GUI } // namespace Slic3r #endif