mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-08 07:27:41 -06:00
Implement ParamsViewCtrl
+ GUI_App : Fixed update of the dark mode, when DataViewCtrl doesn't have header -Orca: currently doesn't seem to display dataview labels properly. TBD if it continues to be an issue. Original Commit: prusa3d/PrusaSlicer@c577b7f Co-authored-by: YuSanka <yusanka@gmail.com>
This commit is contained in:
parent
dd802764b9
commit
bdac496130
5 changed files with 684 additions and 74 deletions
|
@ -7,8 +7,6 @@
|
||||||
#include <wx/stattext.h>
|
#include <wx/stattext.h>
|
||||||
#include <wx/textctrl.h>
|
#include <wx/textctrl.h>
|
||||||
#include <wx/button.h>
|
#include <wx/button.h>
|
||||||
#include <wx/listbox.h>
|
|
||||||
#include <wx/statbox.h>
|
|
||||||
#include <wx/wupdlock.h>
|
#include <wx/wupdlock.h>
|
||||||
|
|
||||||
#include "GUI.hpp"
|
#include "GUI.hpp"
|
||||||
|
@ -18,7 +16,11 @@
|
||||||
#include "Tab.hpp"
|
#include "Tab.hpp"
|
||||||
#include "wxExtensions.hpp"
|
#include "wxExtensions.hpp"
|
||||||
#include "BitmapCache.hpp"
|
#include "BitmapCache.hpp"
|
||||||
|
#include "ExtraRenderers.hpp"
|
||||||
#include "MsgDialog.hpp"
|
#include "MsgDialog.hpp"
|
||||||
|
#include "Plater.hpp"
|
||||||
|
|
||||||
|
#include "libslic3r/Preset.hpp"
|
||||||
|
|
||||||
#define BTN_GAP FromDIP(20)
|
#define BTN_GAP FromDIP(20)
|
||||||
#define BTN_SIZE wxSize(FromDIP(58), FromDIP(24))
|
#define BTN_SIZE wxSize(FromDIP(58), FromDIP(24))
|
||||||
|
@ -29,27 +31,14 @@ namespace GUI {
|
||||||
static wxArrayString get_patterns_list()
|
static wxArrayString get_patterns_list()
|
||||||
{
|
{
|
||||||
wxArrayString patterns;
|
wxArrayString patterns;
|
||||||
for (const wxString& item : {
|
for (const wxString& item : {
|
||||||
";comment"//format_wxstr(";%1%",_L("comment"))
|
"printer_model"
|
||||||
, "M862.3 P \"[printer_model]\" ; printer model check"
|
, "nozzle_diameter"
|
||||||
, "M862.1 P[nozzle_diameter]; nozzle diameter check"
|
, "first_layer_temperature"
|
||||||
, "M115 U3.12.2; tell printer latest fw version"
|
, "first_layer_bed_temperature"
|
||||||
, "G90; use absolute coordinates"
|
, "first_layer_bed_temperature"
|
||||||
, "M83; extruder relative mode"
|
, "first_layer_temperature"
|
||||||
, "M104 S[first_layer_temperature]; set extruder temp"
|
, "initial_tool"
|
||||||
, "M140 S[first_layer_bed_temperature]; set bed temp"
|
|
||||||
, "M190 S[first_layer_bed_temperature]; wait for bed temp"
|
|
||||||
, "M109 S[first_layer_temperature]; wait for extruder temp"
|
|
||||||
, "G28 W; home all without mesh bed level"
|
|
||||||
, "G80; mesh bed leveling"
|
|
||||||
, "M403 E0 F {\n"
|
|
||||||
" + ((filament_type[0] == \"FLEX\") ? 1 : ((filament_type[0] == \"PVA\") ? 2 : 0))\n"
|
|
||||||
"}"
|
|
||||||
, "{if not OPTION}"
|
|
||||||
, "G1"
|
|
||||||
, "T[initial_tool]; select extruder"
|
|
||||||
, "G92 E0"
|
|
||||||
, "{endif}"
|
|
||||||
})
|
})
|
||||||
patterns.Add(item);
|
patterns.Add(item);
|
||||||
return patterns;
|
return patterns;
|
||||||
|
@ -65,26 +54,22 @@ EditGCodeDialog::EditGCodeDialog(wxWindow* parent, const std::string& key, const
|
||||||
SetFont(wxGetApp().normal_font());
|
SetFont(wxGetApp().normal_font());
|
||||||
SetBackgroundColour(*wxWHITE);
|
SetBackgroundColour(*wxWHITE);
|
||||||
wxGetApp().UpdateDarkUI(this);
|
wxGetApp().UpdateDarkUI(this);
|
||||||
|
wxGetApp().UpdateDlgDarkUI(this);
|
||||||
|
|
||||||
int border = 10;
|
int border = 10;
|
||||||
int em = em_unit();
|
int em = em_unit();
|
||||||
|
|
||||||
wxStaticText* label_top = new wxStaticText(this, wxID_ANY, _L("Edit your custom G-code using patterns"));
|
wxStaticText* label_top = new wxStaticText(this, wxID_ANY, _L("Built-in placeholders (Double click item to add to G-code)") + ":");
|
||||||
label_top->SetFont(wxGetApp().bold_font());
|
|
||||||
|
|
||||||
auto* grid_sizer = new wxFlexGridSizer(1, 3, 5, 15);
|
auto* grid_sizer = new wxFlexGridSizer(1, 3, 5, 15);
|
||||||
grid_sizer->SetFlexibleDirection(wxBOTH);
|
grid_sizer->SetFlexibleDirection(wxBOTH);
|
||||||
|
|
||||||
m_patterns_list = new wxListBox(this, wxID_ANY, wxDefaultPosition, wxSize(em * 15, em * 30), get_patterns_list(), wxLB_SINGLE | wxLB_NEEDED_SB | wxLB_SORT
|
m_params_list = new ParamsViewCtrl(this, wxSize(em * 20, em * 30));
|
||||||
#ifdef _WIN32
|
m_params_list->SetFont(wxGetApp().code_font());
|
||||||
| wxBORDER_SIMPLE
|
wxGetApp().UpdateDarkUI(m_params_list);
|
||||||
#endif
|
|
||||||
);
|
|
||||||
m_patterns_list->SetFont(wxGetApp().code_font());
|
|
||||||
wxGetApp().UpdateDarkUI(m_patterns_list);
|
|
||||||
|
|
||||||
m_add_btn = new ScalableButton(this, wxID_ANY, "add_copies");
|
m_add_btn = new ScalableButton(this, wxID_ANY, "add_copies");
|
||||||
m_add_btn->SetToolTip(_L("Add selected pettern to the G-code"));
|
m_add_btn->SetToolTip(_L("Add selected placeholder to G-code"));
|
||||||
|
|
||||||
m_gcode_editor = new wxTextCtrl(this, wxID_ANY, value, wxDefaultPosition, wxSize(em * 45, em * 30), wxTE_MULTILINE
|
m_gcode_editor = new wxTextCtrl(this, wxID_ANY, value, wxDefaultPosition, wxSize(em * 45, em * 30), wxTE_MULTILINE
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -94,7 +79,7 @@ EditGCodeDialog::EditGCodeDialog(wxWindow* parent, const std::string& key, const
|
||||||
m_gcode_editor->SetFont(wxGetApp().code_font());
|
m_gcode_editor->SetFont(wxGetApp().code_font());
|
||||||
wxGetApp().UpdateDarkUI(m_gcode_editor);
|
wxGetApp().UpdateDarkUI(m_gcode_editor);
|
||||||
|
|
||||||
grid_sizer->Add(m_patterns_list, 1, wxEXPAND);
|
grid_sizer->Add(m_params_list, 1, wxEXPAND);
|
||||||
grid_sizer->Add(m_add_btn, 0, wxALIGN_CENTER_VERTICAL);
|
grid_sizer->Add(m_add_btn, 0, wxALIGN_CENTER_VERTICAL);
|
||||||
grid_sizer->Add(m_gcode_editor, 2, wxEXPAND);
|
grid_sizer->Add(m_gcode_editor, 2, wxEXPAND);
|
||||||
|
|
||||||
|
@ -102,6 +87,10 @@ EditGCodeDialog::EditGCodeDialog(wxWindow* parent, const std::string& key, const
|
||||||
grid_sizer->AddGrowableCol(0, 1);
|
grid_sizer->AddGrowableCol(0, 1);
|
||||||
grid_sizer->AddGrowableCol(2, 1);
|
grid_sizer->AddGrowableCol(2, 1);
|
||||||
|
|
||||||
|
m_param_label = new wxStaticText(this, wxID_ANY, _L("Select placeholder"));
|
||||||
|
m_param_label->SetFont(wxGetApp().bold_font());
|
||||||
|
|
||||||
|
//Orca: use custom buttons
|
||||||
auto btn_sizer = create_btn_sizer(wxOK | wxCANCEL);
|
auto btn_sizer = create_btn_sizer(wxOK | wxCANCEL);
|
||||||
for(auto btn : m_button_list)
|
for(auto btn : m_button_list)
|
||||||
wxGetApp().UpdateDarkUI(btn.second);
|
wxGetApp().UpdateDarkUI(btn.second);
|
||||||
|
@ -110,6 +99,7 @@ EditGCodeDialog::EditGCodeDialog(wxWindow* parent, const std::string& key, const
|
||||||
|
|
||||||
topSizer->Add(label_top , 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border);
|
topSizer->Add(label_top , 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border);
|
||||||
topSizer->Add(grid_sizer , 1, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border);
|
topSizer->Add(grid_sizer , 1, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border);
|
||||||
|
topSizer->Add(m_param_label , 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border);
|
||||||
topSizer->Add(btn_sizer , 0, wxEXPAND | wxALL, border);
|
topSizer->Add(btn_sizer , 0, wxEXPAND | wxALL, border);
|
||||||
|
|
||||||
SetSizer(topSizer);
|
SetSizer(topSizer);
|
||||||
|
@ -120,13 +110,106 @@ EditGCodeDialog::EditGCodeDialog(wxWindow* parent, const std::string& key, const
|
||||||
|
|
||||||
this->CenterOnScreen();
|
this->CenterOnScreen();
|
||||||
|
|
||||||
wxGetApp().UpdateDlgDarkUI(this);
|
init_params_list();
|
||||||
|
bind_list_and_button();
|
||||||
|
}
|
||||||
|
|
||||||
m_patterns_list->Bind(wxEVT_LISTBOX_DCLICK, [this](wxCommandEvent& evt) {
|
std::string EditGCodeDialog::get_edited_gcode() const
|
||||||
wxString val = m_patterns_list->GetString(m_patterns_list->GetSelection());
|
{
|
||||||
assert(!val.IsEmpty());
|
return into_u8(m_gcode_editor->GetValue());
|
||||||
auto insert_to = m_gcode_editor->GetInsertionPoint();
|
}
|
||||||
m_gcode_editor->WriteText(val);
|
|
||||||
|
void EditGCodeDialog::init_params_list()
|
||||||
|
{
|
||||||
|
auto list = get_patterns_list();
|
||||||
|
|
||||||
|
m_params_list->AppendGroup(GroupParamsType::SlicingState);
|
||||||
|
for (const auto& sub_gr : { SubSlicingState::ReadOnly, SubSlicingState::ReadWrite }) {
|
||||||
|
int i = 0;
|
||||||
|
for (const wxString& name : list) {
|
||||||
|
const auto param_type = static_cast<ParamType>(1 + std::modulus<int>()(i, 3));
|
||||||
|
m_params_list->AppendParam(GroupParamsType::SlicingState, param_type, into_u8(name), sub_gr);
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto get_set_from_vec = [](const std::vector<std::string>& vec) {
|
||||||
|
return std::set<std::string>(vec.begin(), vec.end());
|
||||||
|
};
|
||||||
|
|
||||||
|
const bool is_fff = wxGetApp().plater()->printer_technology() == ptFFF;
|
||||||
|
const std::set<std::string> print_options = get_set_from_vec(is_fff ? Preset::print_options() : Preset::sla_print_options());
|
||||||
|
const std::set<std::string> material_options = get_set_from_vec(is_fff ? Preset::filament_options() : Preset::sla_material_options());
|
||||||
|
const std::set<std::string> printer_options = get_set_from_vec(is_fff ? Preset::printer_options() : Preset::sla_printer_options());
|
||||||
|
|
||||||
|
const auto& full_config = wxGetApp().preset_bundle->full_config();
|
||||||
|
|
||||||
|
const auto& def = full_config.def()->get("")->label;
|
||||||
|
|
||||||
|
m_params_list->AppendGroup(GroupParamsType::PrintSettings);
|
||||||
|
for (const auto& opt : print_options)
|
||||||
|
if (const ConfigOption *optptr = full_config.optptr(opt))
|
||||||
|
m_params_list->AppendParam(GroupParamsType::PrintSettings, optptr->is_scalar() ? ParamType::Scalar : ParamType::Vector, opt);
|
||||||
|
|
||||||
|
m_params_list->AppendGroup(GroupParamsType::MaterialSettings);
|
||||||
|
for (const auto& opt : material_options)
|
||||||
|
if (const ConfigOption *optptr = full_config.optptr(opt))
|
||||||
|
m_params_list->AppendParam(GroupParamsType::MaterialSettings, optptr->is_scalar() ? ParamType::Scalar : ParamType::FilamentVector, opt);
|
||||||
|
|
||||||
|
m_params_list->AppendGroup(GroupParamsType::PrinterSettings);
|
||||||
|
for (const auto& opt : printer_options)
|
||||||
|
if (const ConfigOption *optptr = full_config.optptr(opt))
|
||||||
|
m_params_list->AppendParam(GroupParamsType::PrinterSettings, optptr->is_scalar() ? ParamType::Scalar : ParamType::Vector, opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditGCodeDialog::add_selected_value_to_gcode()
|
||||||
|
{
|
||||||
|
const wxString val = m_params_list->GetSelectedValue();
|
||||||
|
if (!val.IsEmpty())
|
||||||
|
m_gcode_editor->WriteText(val + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditGCodeDialog::bind_list_and_button()
|
||||||
|
{
|
||||||
|
m_params_list->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, [this](wxDataViewEvent& evt) {
|
||||||
|
wxString label;
|
||||||
|
|
||||||
|
const std::string opt_key = m_params_list->GetSelectedParamKey();
|
||||||
|
if (!opt_key.empty()) {
|
||||||
|
const auto& full_config = wxGetApp().preset_bundle->full_config();
|
||||||
|
if (const ConfigDef* def = full_config.def();
|
||||||
|
def && def->has(opt_key)) {
|
||||||
|
const ConfigOptionDef* cod = def->get(opt_key);
|
||||||
|
const ConfigOption* optptr = full_config.optptr(opt_key);
|
||||||
|
const ConfigOptionType type = optptr->type();
|
||||||
|
|
||||||
|
wxString type_str = type == coNone ? "none" :
|
||||||
|
type == coFloat || type == coFloats ? "float" :
|
||||||
|
type == coInt || type == coInts ? "integer" :
|
||||||
|
type == coString || type == coStrings ? "string" :
|
||||||
|
type == coPercent || type == coPercents ? "percent" :
|
||||||
|
type == coFloatOrPercent || type == coFloatsOrPercents ? "float ar percent" :
|
||||||
|
type == coPoint || type == coPoints || type == coPoint3 ? "point" :
|
||||||
|
type == coBool || type == coBools ? "bool" :
|
||||||
|
type == coEnum ? "enum" : "undef";
|
||||||
|
|
||||||
|
label = ( cod->full_label.empty() && cod->label.empty() ) ? format_wxstr("Undef Label\n(%1%)", type_str) :
|
||||||
|
(!cod->full_label.empty() && !cod->label.empty() ) ?
|
||||||
|
format_wxstr("%1% > %2%\n(%3%)", _(cod->full_label), _(cod->label), type_str) :
|
||||||
|
format_wxstr("%1%\n(%2%)", cod->label.empty() ? _(cod->full_label) : _(cod->label), type_str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_param_label->SetLabel(label);
|
||||||
|
Layout();
|
||||||
|
});
|
||||||
|
|
||||||
|
m_params_list->Bind(wxEVT_DATAVIEW_ITEM_ACTIVATED, [this](wxDataViewEvent& ) {
|
||||||
|
add_selected_value_to_gcode();
|
||||||
|
});
|
||||||
|
|
||||||
|
m_add_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) {
|
||||||
|
add_selected_value_to_gcode();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,17 +217,9 @@ void EditGCodeDialog::on_dpi_changed(const wxRect&suggested_rect)
|
||||||
{
|
{
|
||||||
const int& em = em_unit();
|
const int& em = em_unit();
|
||||||
|
|
||||||
//m_optgroup->msw_rescale();
|
//Orca: use custom buttons
|
||||||
|
|
||||||
// msw_buttons_rescale(this, em, { wxID_OK, wxID_CANCEL });
|
|
||||||
|
|
||||||
for (auto button_item : m_button_list)
|
for (auto button_item : m_button_list)
|
||||||
{
|
{
|
||||||
if (button_item.first == wxRESET)
|
|
||||||
{
|
|
||||||
button_item.second->SetMinSize(wxSize(FromDIP(75), FromDIP(24)));
|
|
||||||
button_item.second->SetCornerRadius(FromDIP(12));
|
|
||||||
}
|
|
||||||
if (button_item.first == wxOK) {
|
if (button_item.first == wxOK) {
|
||||||
button_item.second->SetMinSize(BTN_SIZE);
|
button_item.second->SetMinSize(BTN_SIZE);
|
||||||
button_item.second->SetCornerRadius(FromDIP(12));
|
button_item.second->SetCornerRadius(FromDIP(12));
|
||||||
|
@ -167,11 +242,6 @@ void EditGCodeDialog::on_sys_color_changed()
|
||||||
m_add_btn->sys_color_changed();
|
m_add_btn->sys_color_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditGCodeDialog::OnOK(wxEvent& event)
|
|
||||||
{
|
|
||||||
event.Skip();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Orca
|
//Orca
|
||||||
wxBoxSizer* EditGCodeDialog::create_btn_sizer(long flags)
|
wxBoxSizer* EditGCodeDialog::create_btn_sizer(long flags)
|
||||||
{
|
{
|
||||||
|
@ -248,4 +318,313 @@ wxBoxSizer* EditGCodeDialog::create_btn_sizer(long flags)
|
||||||
return btn_sizer;
|
return btn_sizer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::map<GroupParamsType, std::pair <wxString, std::string>> GroupParamsInfo {
|
||||||
|
// Type Name BitmapName
|
||||||
|
{ GroupParamsType::SlicingState, {L("Slicing State"), "re_slice" }, },
|
||||||
|
{ GroupParamsType::PrintSettings, {L("Print settings"), "cog" }, },
|
||||||
|
{ GroupParamsType::MaterialSettings,{L("Material Settings"),"spool" }, },
|
||||||
|
{ GroupParamsType::PrinterSettings, {L("Printer Settings"), "printer" }, },
|
||||||
|
};
|
||||||
|
|
||||||
|
const std::map<SubSlicingState, std::pair <wxString, std::string>> SubSlicingStateInfo {
|
||||||
|
// Type Name BitmapName
|
||||||
|
{ SubSlicingState::ReadOnly, {L("Read Only"), "lock_closed" }, },
|
||||||
|
{ SubSlicingState::ReadWrite, {L("Read Write"), "lock_open" }, },
|
||||||
|
};
|
||||||
|
|
||||||
|
const std::map<ParamType, std::string> ParamsInfo {
|
||||||
|
// Type BitmapName
|
||||||
|
{ ParamType::Scalar, "scalar_param" },
|
||||||
|
{ ParamType::Vector, "vector_param" },
|
||||||
|
{ ParamType::FilamentVector,"vector_filament_param" },
|
||||||
|
};
|
||||||
|
|
||||||
|
static void make_bold(wxString& str)
|
||||||
|
{
|
||||||
|
#if defined(SUPPORTS_MARKUP) && !defined(__APPLE__)
|
||||||
|
str = format_wxstr("<b>%1%</b>", str);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// ParamsModelNode: a node inside ParamsModel
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
ParamsNode::ParamsNode(GroupParamsType type)
|
||||||
|
: m_group_type (type)
|
||||||
|
{
|
||||||
|
const auto& [name, icon_n] = GroupParamsInfo.at(type);
|
||||||
|
text = _(name);
|
||||||
|
make_bold(text);
|
||||||
|
icon_name = icon_n;
|
||||||
|
}
|
||||||
|
|
||||||
|
ParamsNode::ParamsNode(ParamsNode *parent, SubSlicingState sub_type)
|
||||||
|
: m_parent(parent)
|
||||||
|
, m_group_type(parent->m_group_type)
|
||||||
|
{
|
||||||
|
const auto& [name, icon_n] = SubSlicingStateInfo.at(sub_type);
|
||||||
|
text = _(name);
|
||||||
|
icon_name = icon_n;
|
||||||
|
}
|
||||||
|
|
||||||
|
ParamsNode::ParamsNode( ParamsNode* parent,
|
||||||
|
ParamType param_type,
|
||||||
|
const std::string& param_key,
|
||||||
|
SubSlicingState subgroup_type)
|
||||||
|
: m_parent(parent)
|
||||||
|
, m_group_type(parent->m_group_type)
|
||||||
|
, m_sub_type(subgroup_type)
|
||||||
|
, m_param_type(param_type)
|
||||||
|
, m_container(false)
|
||||||
|
, param_key(param_key)
|
||||||
|
{
|
||||||
|
text = from_u8(param_key);
|
||||||
|
if (param_type == ParamType::Vector)
|
||||||
|
text += "[]";
|
||||||
|
else if (param_type == ParamType::FilamentVector)
|
||||||
|
text += "[current_extruder]";
|
||||||
|
|
||||||
|
icon_name = ParamsInfo.at(param_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// ParamsModel
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
ParamsModel::ParamsModel()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxDataViewItem ParamsModel::AppendGroup(GroupParamsType type)
|
||||||
|
{
|
||||||
|
m_group_nodes[type] = std::make_unique<ParamsNode>(type);
|
||||||
|
|
||||||
|
wxDataViewItem parent(nullptr);
|
||||||
|
wxDataViewItem child((void*)m_group_nodes[type].get());
|
||||||
|
|
||||||
|
ItemAdded(parent, child);
|
||||||
|
m_ctrl->Expand(parent);
|
||||||
|
return child;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDataViewItem ParamsModel::AppendSubGroup(GroupParamsType type, SubSlicingState sub_type)
|
||||||
|
{
|
||||||
|
m_sub_slicing_state_nodes[sub_type] = std::make_unique<ParamsNode>(m_group_nodes[type].get(), sub_type);
|
||||||
|
|
||||||
|
const wxDataViewItem group_item ((void*)m_group_nodes[type].get());
|
||||||
|
const wxDataViewItem sub_group_item((void*)m_sub_slicing_state_nodes[sub_type].get());
|
||||||
|
|
||||||
|
ItemAdded(group_item, sub_group_item);
|
||||||
|
|
||||||
|
m_ctrl->Expand(group_item);
|
||||||
|
return sub_group_item;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDataViewItem ParamsModel::AppendParam(GroupParamsType type,
|
||||||
|
ParamType param_type,
|
||||||
|
const std::string& param_key,
|
||||||
|
SubSlicingState subgroup_type)
|
||||||
|
{
|
||||||
|
ParamsNode* parent_node{ nullptr };
|
||||||
|
if (subgroup_type == SubSlicingState::Undef)
|
||||||
|
parent_node = m_group_nodes[type].get();
|
||||||
|
else {
|
||||||
|
if (m_sub_slicing_state_nodes.find(subgroup_type) == m_sub_slicing_state_nodes.end())
|
||||||
|
AppendSubGroup(type, subgroup_type);
|
||||||
|
parent_node = m_sub_slicing_state_nodes[subgroup_type].get();
|
||||||
|
}
|
||||||
|
|
||||||
|
parent_node->Append(std::make_unique<ParamsNode>(m_group_nodes[type].get(), param_type, param_key, subgroup_type));
|
||||||
|
|
||||||
|
const wxDataViewItem parent_item((void*)parent_node);
|
||||||
|
const wxDataViewItem child_item((void*)parent_node->GetChildren().back().get());
|
||||||
|
|
||||||
|
ItemAdded(parent_item, child_item);
|
||||||
|
return child_item;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString ParamsModel::GetParamName(wxDataViewItem item)
|
||||||
|
{
|
||||||
|
if (item.IsOk()) {
|
||||||
|
ParamsNode* node = static_cast<ParamsNode*>(item.GetID());
|
||||||
|
if (node->IsParamNode())
|
||||||
|
return node->text;
|
||||||
|
}
|
||||||
|
return wxEmptyString;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ParamsModel::GetParamKey(wxDataViewItem item)
|
||||||
|
{
|
||||||
|
if (item.IsOk()) {
|
||||||
|
ParamsNode* node = static_cast<ParamsNode*>(item.GetID());
|
||||||
|
return node->param_key;
|
||||||
|
}
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParamsModel::Rescale()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParamsModel::Clear()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParamsModel::GetValue(wxVariant& variant, const wxDataViewItem& item, unsigned int col) const
|
||||||
|
{
|
||||||
|
assert(item.IsOk());
|
||||||
|
|
||||||
|
ParamsNode* node = static_cast<ParamsNode*>(item.GetID());
|
||||||
|
if (col == 0)
|
||||||
|
#ifdef __linux__
|
||||||
|
variant << wxDataViewIconText(node->text, get_bmp_bundle(node->icon_name)->GetIconFor(m_ctrl->GetParent()));
|
||||||
|
#else
|
||||||
|
variant << DataViewBitmapText(node->text, get_bmp_bundle(node->icon_name)->GetBitmapFor(m_ctrl->GetParent()));
|
||||||
|
#endif //__linux__
|
||||||
|
else
|
||||||
|
wxLogError("DiffModel::GetValue: wrong column %d", col);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParamsModel::SetValue(const wxVariant& variant, const wxDataViewItem& item, unsigned int col)
|
||||||
|
{
|
||||||
|
assert(item.IsOk());
|
||||||
|
|
||||||
|
ParamsNode* node = static_cast<ParamsNode*>(item.GetID());
|
||||||
|
if (col == 0) {
|
||||||
|
#ifdef __linux__
|
||||||
|
wxDataViewIconText data;
|
||||||
|
data << variant;
|
||||||
|
node->m_icon = data.GetIcon();
|
||||||
|
#else
|
||||||
|
DataViewBitmapText data;
|
||||||
|
data << variant;
|
||||||
|
node->icon = data.GetBitmap();
|
||||||
|
#endif
|
||||||
|
node->text = data.GetText();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxLogError("DiffModel::SetValue: wrong column");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDataViewItem ParamsModel::GetParent(const wxDataViewItem&item) const
|
||||||
|
{
|
||||||
|
// the invisible root node has no parent
|
||||||
|
if (!item.IsOk())
|
||||||
|
return wxDataViewItem(nullptr);
|
||||||
|
|
||||||
|
ParamsNode* node = static_cast<ParamsNode*>(item.GetID());
|
||||||
|
|
||||||
|
if (node->IsGroupNode())
|
||||||
|
return wxDataViewItem(nullptr);
|
||||||
|
|
||||||
|
return wxDataViewItem((void*)node->GetParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParamsModel::IsContainer(const wxDataViewItem& item) const
|
||||||
|
{
|
||||||
|
// the invisble root node can have children
|
||||||
|
if (!item.IsOk())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
ParamsNode* node = static_cast<ParamsNode*>(item.GetID());
|
||||||
|
return node->IsContainer();
|
||||||
|
}
|
||||||
|
unsigned int ParamsModel::GetChildren(const wxDataViewItem& parent, wxDataViewItemArray& array) const
|
||||||
|
{
|
||||||
|
ParamsNode* parent_node = (ParamsNode*)parent.GetID();
|
||||||
|
|
||||||
|
if (parent_node == nullptr) {
|
||||||
|
for (const auto& [type, group] : m_group_nodes)
|
||||||
|
array.Add(wxDataViewItem((void*)group.get()));
|
||||||
|
}
|
||||||
|
else if (parent_node->IsGroupNode() && parent_node->GetChildren().empty()) {
|
||||||
|
for (const auto& [type, sub_group] : m_sub_slicing_state_nodes)
|
||||||
|
array.Add(wxDataViewItem((void*)sub_group.get()));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const ParamsNodePtrArray& children = parent_node->GetChildren();
|
||||||
|
for (const std::unique_ptr<ParamsNode>& child : children)
|
||||||
|
array.Add(wxDataViewItem((void*)child.get()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return array.Count();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// ParamsViewCtrl
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
ParamsViewCtrl::ParamsViewCtrl(wxWindow *parent, wxSize size)
|
||||||
|
: wxDataViewCtrl(parent, wxID_ANY, wxDefaultPosition, size, wxDV_SINGLE | wxDV_NO_HEADER// | wxDV_ROW_LINES
|
||||||
|
#ifdef _WIN32
|
||||||
|
| wxBORDER_SIMPLE
|
||||||
|
#endif
|
||||||
|
),
|
||||||
|
m_em_unit(em_unit(parent))
|
||||||
|
{
|
||||||
|
wxGetApp().UpdateDVCDarkUI(this);
|
||||||
|
|
||||||
|
model = new ParamsModel();
|
||||||
|
this->AssociateModel(model);
|
||||||
|
model->SetAssociatedControl(this);
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
wxDataViewIconTextRenderer* rd = new wxDataViewIconTextRenderer();
|
||||||
|
#ifdef SUPPORTS_MARKUP
|
||||||
|
rd->EnableMarkup(true);
|
||||||
|
#endif
|
||||||
|
wxDataViewColumn* column = new wxDataViewColumn("", rd, 0, width * m_em_unit, wxALIGN_TOP, wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_CELL_INERT);
|
||||||
|
#else
|
||||||
|
wxDataViewColumn* column = new wxDataViewColumn("", new BitmapTextRenderer(true, wxDATAVIEW_CELL_INERT), 0, 20 * m_em_unit, wxALIGN_TOP, wxDATAVIEW_COL_RESIZABLE);
|
||||||
|
#endif //__linux__
|
||||||
|
this->AppendColumn(column);
|
||||||
|
this->SetExpanderColumn(column);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDataViewItem ParamsViewCtrl::AppendGroup(GroupParamsType type)
|
||||||
|
{
|
||||||
|
return model->AppendGroup(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDataViewItem ParamsViewCtrl::AppendParam( GroupParamsType group_type,
|
||||||
|
ParamType param_type,
|
||||||
|
const std::string& param_key,
|
||||||
|
SubSlicingState subgroup_type /*= SubSlicingState::Undef*/)
|
||||||
|
{
|
||||||
|
return model->AppendParam(group_type, param_type, param_key, subgroup_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString ParamsViewCtrl::GetValue(wxDataViewItem item)
|
||||||
|
{
|
||||||
|
return model->GetParamName(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString ParamsViewCtrl::GetSelectedValue()
|
||||||
|
{
|
||||||
|
return model->GetParamName(this->GetSelection());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ParamsViewCtrl::GetSelectedParamKey()
|
||||||
|
{
|
||||||
|
return model->GetParamKey(this->GetSelection());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParamsViewCtrl::Clear()
|
||||||
|
{
|
||||||
|
model->Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParamsViewCtrl::Rescale(int em/* = 0*/)
|
||||||
|
{
|
||||||
|
model->Rescale();
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
}} // namespace Slic3r::GUI
|
}} // namespace Slic3r::GUI
|
||||||
|
|
|
@ -7,18 +7,18 @@
|
||||||
#include <slic3r/GUI/Widgets/Button.hpp>
|
#include <slic3r/GUI/Widgets/Button.hpp>
|
||||||
|
|
||||||
#include "GUI_Utils.hpp"
|
#include "GUI_Utils.hpp"
|
||||||
|
#include "wxExtensions.hpp"
|
||||||
|
#include "libslic3r/Preset.hpp"
|
||||||
|
|
||||||
class wxListBox;
|
class wxListBox;
|
||||||
class wxTextCtrl;
|
class wxTextCtrl;
|
||||||
//class wxStaticText;
|
|
||||||
class ScalableButton;
|
class ScalableButton;
|
||||||
//class wxBoxSizer;
|
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
class PresetComboBox;
|
class ParamsViewCtrl;
|
||||||
|
|
||||||
//------------------------------------------
|
//------------------------------------------
|
||||||
// EditGCodeDialog
|
// EditGCodeDialog
|
||||||
|
@ -26,16 +26,21 @@ class PresetComboBox;
|
||||||
|
|
||||||
class EditGCodeDialog : public DPIDialog
|
class EditGCodeDialog : public DPIDialog
|
||||||
{
|
{
|
||||||
wxListBox* m_patterns_list {nullptr};
|
ParamsViewCtrl* m_params_list {nullptr};
|
||||||
ScalableButton* m_add_btn {nullptr};
|
ScalableButton* m_add_btn {nullptr};
|
||||||
wxTextCtrl* m_gcode_editor {nullptr};
|
wxTextCtrl* m_gcode_editor {nullptr};
|
||||||
|
wxStaticText* m_param_label {nullptr};
|
||||||
void OnOK(wxEvent& event);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EditGCodeDialog(wxWindow* parent, const std::string& key, const std::string& value);
|
EditGCodeDialog(wxWindow*parent, const std::string&key, const std::string&value);
|
||||||
~EditGCodeDialog() {}
|
~EditGCodeDialog() {}
|
||||||
|
|
||||||
|
std::string get_edited_gcode() const;
|
||||||
|
|
||||||
|
void init_params_list();
|
||||||
|
void add_selected_value_to_gcode();
|
||||||
|
void bind_list_and_button();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::unordered_map<int, Button *> m_button_list;
|
std::unordered_map<int, Button *> m_button_list;
|
||||||
|
|
||||||
|
@ -45,6 +50,198 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// ParamsModelNode: a node inside ParamsModel
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class ParamsNode;
|
||||||
|
using ParamsNodePtrArray = std::vector<std::unique_ptr<ParamsNode>>;
|
||||||
|
|
||||||
|
// Discard and Cancel buttons are always but next buttons are optional
|
||||||
|
enum class GroupParamsType {
|
||||||
|
SlicingState,
|
||||||
|
PrintSettings,
|
||||||
|
MaterialSettings,
|
||||||
|
PrinterSettings,
|
||||||
|
};
|
||||||
|
using GroupParamsNodePtrMap = std::map<GroupParamsType, std::unique_ptr<ParamsNode>>;
|
||||||
|
|
||||||
|
enum class SubSlicingState {
|
||||||
|
Undef,
|
||||||
|
ReadOnly,
|
||||||
|
ReadWrite,
|
||||||
|
};
|
||||||
|
using SubSlicingStateNodePtrMap = std::map<SubSlicingState, std::unique_ptr<ParamsNode>>;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
GroupParamsType m_group_type{ GroupParamsType::SlicingState };
|
||||||
|
SubSlicingState m_sub_type { SubSlicingState::Undef };
|
||||||
|
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(GroupParamsType type);
|
||||||
|
|
||||||
|
// sub SlicingState node
|
||||||
|
ParamsNode(ParamsNode* parent, SubSlicingState sub_type);
|
||||||
|
|
||||||
|
// parametre node
|
||||||
|
ParamsNode( ParamsNode* parent,
|
||||||
|
ParamType param_type,
|
||||||
|
const std::string& param_key,
|
||||||
|
SubSlicingState subgroup_type);
|
||||||
|
|
||||||
|
bool IsContainer() const { return m_container; }
|
||||||
|
bool IsGroupNode() const { return m_parent == nullptr; }
|
||||||
|
bool IsSubGroupNode() const { return m_sub_type != SubSlicingState::Undef; }
|
||||||
|
bool IsParamNode() const { return m_param_type != ParamType::Undef; }
|
||||||
|
|
||||||
|
ParamsNode* GetParent() { return m_parent; }
|
||||||
|
ParamsNodePtrArray& GetChildren() { return m_children; }
|
||||||
|
|
||||||
|
void Append(std::unique_ptr<ParamsNode> child) { m_children.emplace_back(std::move(child)); }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// ParamsModel
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class ParamsModel : public wxDataViewModel
|
||||||
|
{
|
||||||
|
GroupParamsNodePtrMap m_group_nodes;
|
||||||
|
SubSlicingStateNodePtrMap m_sub_slicing_state_nodes;
|
||||||
|
|
||||||
|
wxDataViewCtrl* m_ctrl{ nullptr };
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
ParamsModel();
|
||||||
|
~ParamsModel() override = default;
|
||||||
|
|
||||||
|
void SetAssociatedControl(wxDataViewCtrl* ctrl) { m_ctrl = ctrl; }
|
||||||
|
|
||||||
|
wxDataViewItem AppendGroup(GroupParamsType type);
|
||||||
|
|
||||||
|
wxDataViewItem AppendSubGroup( GroupParamsType type,
|
||||||
|
SubSlicingState sub_type);
|
||||||
|
|
||||||
|
wxDataViewItem AppendParam(GroupParamsType type,
|
||||||
|
ParamType param_type,
|
||||||
|
const std::string& param_key,
|
||||||
|
SubSlicingState subgroup_type = SubSlicingState::Undef);
|
||||||
|
|
||||||
|
wxString GetParamName(wxDataViewItem item);
|
||||||
|
std::string GetParamKey(wxDataViewItem item);
|
||||||
|
|
||||||
|
void Rescale();
|
||||||
|
|
||||||
|
void Clear();
|
||||||
|
|
||||||
|
wxDataViewItem GetParent(const wxDataViewItem& item) const override;
|
||||||
|
unsigned int GetChildren(const wxDataViewItem& parent, wxDataViewItemArray& array) 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;
|
||||||
|
|
||||||
|
//struct ItemData
|
||||||
|
//{
|
||||||
|
// std::string opt_key;
|
||||||
|
// wxString opt_name;
|
||||||
|
// wxString old_val;
|
||||||
|
// wxString mod_val;
|
||||||
|
// wxString new_val;
|
||||||
|
// Preset::Type type;
|
||||||
|
// bool is_long{ false };
|
||||||
|
//};
|
||||||
|
|
||||||
|
//// tree items related to the options
|
||||||
|
//std::map<wxDataViewItem, ItemData> m_items_map;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ParamsViewCtrl(wxWindow* parent, wxSize size);
|
||||||
|
~ParamsViewCtrl() override {
|
||||||
|
if (model) {
|
||||||
|
Clear();
|
||||||
|
model->DecRef();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ParamsModel* model{ nullptr };
|
||||||
|
|
||||||
|
wxDataViewItem AppendGroup( GroupParamsType type);
|
||||||
|
|
||||||
|
wxDataViewItem AppendParam( GroupParamsType group_type,
|
||||||
|
ParamType param_type,
|
||||||
|
const std::string& param_key,
|
||||||
|
SubSlicingState group_subgroup_type = SubSlicingState::Undef);
|
||||||
|
|
||||||
|
wxString GetValue(wxDataViewItem item);
|
||||||
|
wxString GetSelectedValue();
|
||||||
|
std::string GetSelectedParamKey();
|
||||||
|
|
||||||
|
void Clear();
|
||||||
|
void Rescale(int em = 0);
|
||||||
|
|
||||||
|
void set_em_unit(int em) { m_em_unit = em; }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
} // namespace GUI
|
} // namespace GUI
|
||||||
} // namespace Slic3r
|
} // namespace Slic3r
|
||||||
|
|
||||||
|
|
|
@ -3181,14 +3181,17 @@ void GUI_App::UpdateDVCDarkUI(wxDataViewCtrl* dvc, bool highlited/* = false*/)
|
||||||
UpdateDarkUI(dvc, highlited ? dark_mode() : false);
|
UpdateDarkUI(dvc, highlited ? dark_mode() : false);
|
||||||
#ifdef _MSW_DARK_MODE
|
#ifdef _MSW_DARK_MODE
|
||||||
//dvc->RefreshHeaderDarkMode(&m_normal_font);
|
//dvc->RefreshHeaderDarkMode(&m_normal_font);
|
||||||
HWND hwnd = (HWND)dvc->GenericGetHeader()->GetHandle();
|
HWND hwnd;
|
||||||
hwnd = GetWindow(hwnd, GW_CHILD);
|
if (!dvc->HasFlag(wxDV_NO_HEADER)) {
|
||||||
if (hwnd != NULL)
|
hwnd = (HWND) dvc->GenericGetHeader()->GetHandle();
|
||||||
NppDarkMode::SetDarkListViewHeader(hwnd);
|
hwnd = GetWindow(hwnd, GW_CHILD);
|
||||||
wxItemAttr attr;
|
if (hwnd != NULL)
|
||||||
attr.SetTextColour(NppDarkMode::GetTextColor());
|
NppDarkMode::SetDarkListViewHeader(hwnd);
|
||||||
attr.SetFont(m_normal_font);
|
wxItemAttr attr;
|
||||||
dvc->SetHeaderAttr(attr);
|
attr.SetTextColour(NppDarkMode::GetTextColor());
|
||||||
|
attr.SetFont(m_normal_font);
|
||||||
|
dvc->SetHeaderAttr(attr);
|
||||||
|
}
|
||||||
#endif //_MSW_DARK_MODE
|
#endif //_MSW_DARK_MODE
|
||||||
if (dvc->HasFlag(wxDV_ROW_LINES))
|
if (dvc->HasFlag(wxDV_ROW_LINES))
|
||||||
dvc->SetAlternateRowColour(m_color_highlight_default);
|
dvc->SetAlternateRowColour(m_color_highlight_default);
|
||||||
|
|
|
@ -2869,12 +2869,39 @@ static void validate_custom_gcode_cb(Tab* tab, ConfigOptionsGroupShp opt_group,
|
||||||
|
|
||||||
void Tab::edit_custom_gcode(const t_config_option_key& opt_key)
|
void Tab::edit_custom_gcode(const t_config_option_key& opt_key)
|
||||||
{
|
{
|
||||||
EditGCodeDialog(this, opt_key, m_config->opt_string(opt_key)).ShowModal();
|
EditGCodeDialog dlg = EditGCodeDialog(this, opt_key, get_custom_gcode(opt_key));
|
||||||
|
if (dlg.ShowModal() == wxID_OK) {
|
||||||
|
set_custom_gcode(opt_key, dlg.get_edited_gcode());
|
||||||
|
update_dirty();
|
||||||
|
update();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabFilament::edit_custom_gcode(const t_config_option_key& opt_key)
|
const std::string& Tab::get_custom_gcode(const t_config_option_key& opt_key)
|
||||||
{
|
{
|
||||||
EditGCodeDialog(this, opt_key, m_config->opt_string(opt_key, unsigned(m_presets_choice->GetSelection()))).ShowModal();
|
return m_config->opt_string(opt_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Tab::set_custom_gcode(const t_config_option_key& opt_key, const std::string& value)
|
||||||
|
{
|
||||||
|
DynamicPrintConfig new_conf = *m_config;
|
||||||
|
new_conf.set_key_value(opt_key, new ConfigOptionString(value));
|
||||||
|
load_config(new_conf);
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string& TabFilament::get_custom_gcode(const t_config_option_key& opt_key)
|
||||||
|
{
|
||||||
|
return m_config->opt_string(opt_key, unsigned(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
void TabFilament::set_custom_gcode(const t_config_option_key& opt_key, const std::string& value)
|
||||||
|
{
|
||||||
|
std::vector<std::string> gcodes = static_cast<const ConfigOptionStrings*>(m_config->option(opt_key))->values;
|
||||||
|
gcodes[0] = value;
|
||||||
|
|
||||||
|
DynamicPrintConfig new_conf = *m_config;
|
||||||
|
new_conf.set_key_value(opt_key, new ConfigOptionStrings(gcodes));
|
||||||
|
load_config(new_conf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabFilament::add_filament_overrides_page()
|
void TabFilament::add_filament_overrides_page()
|
||||||
|
|
|
@ -408,7 +408,9 @@ public:
|
||||||
bool validate_custom_gcodes_was_shown{ false };
|
bool validate_custom_gcodes_was_shown{ false };
|
||||||
void set_just_edit(bool just_edit);
|
void set_just_edit(bool just_edit);
|
||||||
|
|
||||||
virtual void edit_custom_gcode(const t_config_option_key &opt_key);
|
void edit_custom_gcode(const t_config_option_key& opt_key);
|
||||||
|
virtual const std::string& get_custom_gcode(const t_config_option_key& opt_key);
|
||||||
|
virtual void set_custom_gcode(const t_config_option_key& opt_key, const std::string& value);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void create_line_with_widget(ConfigOptionsGroup* optgroup, const std::string& opt_key, const std::string& path, widget_t widget);
|
void create_line_with_widget(ConfigOptionsGroup* optgroup, const std::string& opt_key, const std::string& path, widget_t widget);
|
||||||
|
@ -562,7 +564,9 @@ public:
|
||||||
void update() override;
|
void update() override;
|
||||||
void clear_pages() override;
|
void clear_pages() override;
|
||||||
bool supports_printer_technology(const PrinterTechnology tech) const override { return tech == ptFFF; }
|
bool supports_printer_technology(const PrinterTechnology tech) const override { return tech == ptFFF; }
|
||||||
void edit_custom_gcode(const t_config_option_key& opt_key) override;
|
|
||||||
|
const std::string& get_custom_gcode(const t_config_option_key& opt_key) override;
|
||||||
|
void set_custom_gcode(const t_config_option_key& opt_key, const std::string& value) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class TabPrinter : public Tab
|
class TabPrinter : public Tab
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue