Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorremi durand <remi-j.durand@thalesgroup.com>2021-06-12 20:48:06 +0300
committerremi durand <remi-j.durand@thalesgroup.com>2021-06-12 20:48:06 +0300
commit1bd0a1bb4de94662ed145ea5537859c8f165bbe1 (patch)
treed24b5a39a31eeeac6d9aee557b1e0e670a141954
parent18a49e43051270da565de0ba0fe0410f99194657 (diff)
parentc082d1972f30ba85d377df776b90aefe069517bc (diff)
Merge branch 'merill-merge'2.3.56.5
-rw-r--r--.github/workflows/ccpp_mac_rc.yml2
-rw-r--r--.github/workflows/ccpp_ubuntu_rc.yml2
-rw-r--r--.github/workflows/ccpp_win_rc.yml2
m---------resources/profiles0
-rw-r--r--src/libslic3r/GCode.cpp10
-rw-r--r--src/libslic3r/GCode.hpp2
-rw-r--r--src/libslic3r/GCode/CoolingBuffer.cpp2
-rw-r--r--src/libslic3r/PresetBundle.cpp2
-rw-r--r--src/libslic3r/PrintConfig.cpp1
-rw-r--r--src/libslic3r/PrintConfig.hpp2
-rw-r--r--src/slic3r/GUI/ConfigWizard.cpp4
-rw-r--r--src/slic3r/GUI/GCodeViewer.cpp50
-rw-r--r--src/slic3r/GUI/KBShortcutsDialog.cpp4
-rw-r--r--src/slic3r/GUI/MainFrame.cpp16
-rw-r--r--src/slic3r/GUI/Plater.cpp8
-rw-r--r--src/slic3r/GUI/PresetComboBoxes.cpp33
16 files changed, 91 insertions, 49 deletions
diff --git a/.github/workflows/ccpp_mac_rc.yml b/.github/workflows/ccpp_mac_rc.yml
index e1e82ab58..5cd943f39 100644
--- a/.github/workflows/ccpp_mac_rc.yml
+++ b/.github/workflows/ccpp_mac_rc.yml
@@ -13,7 +13,7 @@ jobs:
steps:
- uses: actions/checkout@v2
with:
- ref: 'Nigthly'
+ ref: 'rc'
- name: update submodule profiles
working-directory: ./resources/profiles
run: git submodule update --init
diff --git a/.github/workflows/ccpp_ubuntu_rc.yml b/.github/workflows/ccpp_ubuntu_rc.yml
index f7f3a9d8f..9cd75ddc7 100644
--- a/.github/workflows/ccpp_ubuntu_rc.yml
+++ b/.github/workflows/ccpp_ubuntu_rc.yml
@@ -13,7 +13,7 @@ jobs:
steps:
- uses: actions/checkout@v2
with:
- ref: 'Nigthly'
+ ref: 'rc'
- name: update submodule profiles
working-directory: ./resources/profiles
run: git submodule update --init
diff --git a/.github/workflows/ccpp_win_rc.yml b/.github/workflows/ccpp_win_rc.yml
index 7cb5f2718..419ab977d 100644
--- a/.github/workflows/ccpp_win_rc.yml
+++ b/.github/workflows/ccpp_win_rc.yml
@@ -12,7 +12,7 @@ jobs:
steps:
- uses: actions/checkout@v2
with:
- ref: 'Nigthly'
+ ref: 'rc'
- uses: ilammy/msvc-dev-cmd@v1
- name: mkdir in deps
run: mkdir deps/build
diff --git a/resources/profiles b/resources/profiles
-Subproject 44b68776a21faaa15499c4027fc183f595734ab
+Subproject f64fb444097e5f3e48c6b28f6c3453bd8eb839e
diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp
index 5c6dc30dc..1a2fa9c96 100644
--- a/src/libslic3r/GCode.cpp
+++ b/src/libslic3r/GCode.cpp
@@ -3876,6 +3876,9 @@ std::string GCode::_after_extrude(const ExtrusionPath &path) {
else
gcode += ";_EXTRUDE_END\n";
+ if (path.role() != ExtrusionRole::erGapFill ) {
+ m_last_notgapfill_extrusion_role = path.role();
+ }
this->set_last_pos(path.last_point());
return gcode;
@@ -4003,11 +4006,14 @@ std::string GCode::retract(bool toolchange)
length is honored in case wipe path was too short. */
gcode += toolchange ? m_writer.retract_for_toolchange() : m_writer.retract();
bool need_lift = !m_writer.tool_is_extruder() || toolchange || (BOOL_EXTRUDER_CONFIG(retract_lift_first_layer) && m_config.print_retract_lift.value != 0 && this->m_layer_index == 0);
+ bool last_fill_extusion_role_top_infill = (this->m_last_extrusion_role == ExtrusionRole::erTopSolidInfill);
+ if(this->m_last_extrusion_role == ExtrusionRole::erGapFill)
+ last_fill_extusion_role_top_infill = (this->m_last_notgapfill_extrusion_role == ExtrusionRole::erTopSolidInfill);
if (!need_lift && m_config.print_retract_lift.value != 0) {
if (EXTRUDER_CONFIG_WITH_DEFAULT(retract_lift_top, "") == "Not on top")
- need_lift = (this->m_last_extrusion_role != ExtrusionRole::erTopSolidInfill);
+ need_lift = !last_fill_extusion_role_top_infill;
else if (EXTRUDER_CONFIG_WITH_DEFAULT(retract_lift_top, "") == "Only on top")
- need_lift = (this->m_last_extrusion_role == ExtrusionRole::erTopSolidInfill);
+ need_lift = last_fill_extusion_role_top_infill;
else
need_lift = true;
}
diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp
index 3c92322fc..e9df3df2a 100644
--- a/src/libslic3r/GCode.hpp
+++ b/src/libslic3r/GCode.hpp
@@ -359,6 +359,8 @@ private:
double m_volumetric_speed;
// Support for the extrusion role markers. Which marker is active?
ExtrusionRole m_last_extrusion_role;
+ // Not know the gapfill role for retract_lift_top
+ ExtrusionRole m_last_notgapfill_extrusion_role;
// Support for G-Code Processor
float m_last_height{ 0.0f };
float m_last_layer_z{ 0.0f };
diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp
index e47133cc7..49be67a6e 100644
--- a/src/libslic3r/GCode/CoolingBuffer.cpp
+++ b/src/libslic3r/GCode/CoolingBuffer.cpp
@@ -284,7 +284,7 @@ finished:
float time_stretch_final = 0.f;
for (auto it = it_begin; it != it_end; ++ it)
time_stretch_final += (*it)->time_stretch_when_slowing_down_to_feedrate(new_feedrate);
- assert(std::abs(time_stretch - time_stretch_final) < EPSILON);
+ //assert(std::abs(time_stretch - time_stretch_final) < EPSILON);
}
#endif /* NDEBUG */
diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp
index ce7ca17ce..f709ae926 100644
--- a/src/libslic3r/PresetBundle.cpp
+++ b/src/libslic3r/PresetBundle.cpp
@@ -470,7 +470,7 @@ void PresetBundle::load_selections(AppConfig &config, const std::string &preferr
void PresetBundle::export_selections(AppConfig &config)
{
assert(this->printers.get_edited_preset().printer_technology() != ptFFF || filament_presets.size() >= 1);
- assert(this->printers.get_edited_preset().printer_technology() != ptFFF || filament_presets.size() > 1 || filaments.get_selected_preset_name() == filament_presets.front());
+ //assert(this->printers.get_edited_preset().printer_technology() != ptFFF || filament_presets.size() > 1 || filaments.get_selected_preset_name() == filament_presets.front());
config.clear_section("presets");
config.set("presets", "print", prints.get_selected_preset_name());
config.set("presets", "filament", filament_presets.front());
diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp
index d46443c0e..c3b6310e9 100644
--- a/src/libslic3r/PrintConfig.cpp
+++ b/src/libslic3r/PrintConfig.cpp
@@ -125,7 +125,6 @@ void PrintConfigDef::init_common_params()
def->tooltip = L("Set this to the maximum height that can be reached by your extruder while printing.");
def->sidetext = L("mm");
def->min = 0;
- def->max = 1200;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloat(200.0));
diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp
index c11c5c8cb..45a1f4f81 100644
--- a/src/libslic3r/PrintConfig.hpp
+++ b/src/libslic3r/PrintConfig.hpp
@@ -193,7 +193,7 @@ template<> inline const t_config_enum_values& ConfigOptionEnum<WipeAlgo>::get_en
template<> inline const t_config_enum_values& ConfigOptionEnum<GCodeFlavor>::get_enum_values() {
static t_config_enum_values keys_map = {
- {"reprap", gcfRepRap},
+ {"reprapfirmware", gcfRepRap},
{"repetier", gcfRepetier},
{"teacup", gcfTeacup},
{"makerware", gcfMakerWare},
diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp
index 5e9961e2e..3504cb7f0 100644
--- a/src/slic3r/GUI/ConfigWizard.cpp
+++ b/src/slic3r/GUI/ConfigWizard.cpp
@@ -636,10 +636,10 @@ PageMaterials::PageMaterials(ConfigWizard *parent, Materials *materials, wxStrin
update_lists(evt.GetInt(), list_type->GetSelection(), list_vendor->GetSelection());
});
list_type->Bind(wxEVT_LISTBOX, [this](wxCommandEvent &) {
- update_lists(list_printer->GetSelection(), list_type->GetSelection(), list_vendor->GetSelection());
+ update_lists(-1, list_type->GetSelection(), list_vendor->GetSelection());
});
list_vendor->Bind(wxEVT_LISTBOX, [this](wxCommandEvent &) {
- update_lists(list_printer->GetSelection(), list_type->GetSelection(), list_vendor->GetSelection());
+ update_lists(-1, list_type->GetSelection(), list_vendor->GetSelection());
});
list_profile->Bind(wxEVT_CHECKLISTBOX, [this](wxCommandEvent &evt) { select_material(evt.GetInt()); });
diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp
index 55d31f684..2fc92f503 100644
--- a/src/slic3r/GUI/GCodeViewer.cpp
+++ b/src/slic3r/GUI/GCodeViewer.cpp
@@ -3013,7 +3013,9 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool
#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS
for (const auto& [tbuffer_id, ibuffer_id, path_id, sub_path_id] : paths) {
TBuffer& buffer = const_cast<TBuffer&>(m_buffers[tbuffer_id]);
+ if (buffer.paths.size() <= path_id) return; // invalid data check
const Path& path = buffer.paths[path_id];
+ if (m_tool_colors.size() <= path.extruder_id) return; // invalid data check
#else
for (const auto& [buffer, ibuffer_id, path_id, sub_path_id] : paths) {
const Path& path = buffer->paths[path_id];
@@ -4192,7 +4194,8 @@ void GCodeViewer::render_legend() const
{
// shows only extruders actually used
for (unsigned char i : m_extruder_ids) {
- append_item(EItemType::Rect, m_tool_colors[i], _u8L("Extruder") + " " + std::to_string(i + 1));
+ if(m_tool_colors.size() > i)
+ append_item(EItemType::Rect, m_tool_colors[i], _u8L("Extruder") + " " + std::to_string(i + 1));
}
break;
}
@@ -4200,7 +4203,8 @@ void GCodeViewer::render_legend() const
{
// shows only filament actually used
for (unsigned char i : m_extruder_ids) {
- append_item(EItemType::Rect, m_filament_colors[i], _u8L("Filament") + " " + std::to_string(i + 1));
+ if (m_filament_colors.size() > i)
+ append_item(EItemType::Rect, m_filament_colors[i], _u8L("Filament") + " " + std::to_string(i + 1));
}
break;
}
@@ -4232,28 +4236,30 @@ void GCodeViewer::render_legend() const
{
// shows only extruders actually used
for (unsigned char i : m_extruder_ids) {
- std::vector<std::pair<Color, std::pair<double, double>>> cp_values = color_print_ranges(i, custom_gcode_per_print_z);
- const int items_cnt = static_cast<int>(cp_values.size());
- if (items_cnt == 0) { // There are no color changes, but there are some pause print or custom Gcode
- append_item(EItemType::Rect, m_tool_colors[i], _u8L("Extruder") + " " + std::to_string(i + 1) + " " + _u8L("default color"));
- }
- else {
- for (int j = items_cnt; j >= 0; --j) {
- // create label for color change item
- std::string label = _u8L("Extruder") + " " + std::to_string(i + 1);
- if (j == 0) {
- label += " " + upto_label(cp_values.front().second.first);
- append_item(EItemType::Rect, m_tool_colors[i], label);
- break;
- }
- else if (j == items_cnt) {
- label += " " + above_label(cp_values[j - 1].second.second);
+ if (m_tool_colors.size() > i) {
+ std::vector<std::pair<Color, std::pair<double, double>>> cp_values = color_print_ranges(i, custom_gcode_per_print_z);
+ const int items_cnt = static_cast<int>(cp_values.size());
+ if (items_cnt == 0) { // There are no color changes, but there are some pause print or custom Gcode
+ append_item(EItemType::Rect, m_tool_colors[i], _u8L("Extruder") + " " + std::to_string(i + 1) + " " + _u8L("default color"));
+ }
+ else {
+ for (int j = items_cnt; j >= 0; --j) {
+ // create label for color change item
+ std::string label = _u8L("Extruder") + " " + std::to_string(i + 1);
+ if (j == 0) {
+ label += " " + upto_label(cp_values.front().second.first);
+ append_item(EItemType::Rect, m_tool_colors[i], label);
+ break;
+ }
+ else if (j == items_cnt) {
+ label += " " + above_label(cp_values[j - 1].second.second);
+ append_item(EItemType::Rect, cp_values[j - 1].first, label);
+ continue;
+ }
+
+ label += " " + fromto_label(cp_values[j - 1].second.second, cp_values[j].second.first);
append_item(EItemType::Rect, cp_values[j - 1].first, label);
- continue;
}
-
- label += " " + fromto_label(cp_values[j - 1].second.second, cp_values[j].second.first);
- append_item(EItemType::Rect, cp_values[j - 1].first, label);
}
}
}
diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp
index 6a5c235dd..42a92b8f1 100644
--- a/src/slic3r/GUI/KBShortcutsDialog.cpp
+++ b/src/slic3r/GUI/KBShortcutsDialog.cpp
@@ -109,7 +109,11 @@ void KBShortcutsDialog::fill_shortcuts()
{ "0-6", L("Camera view") },
{ "E", L("Show/Hide object/instance labels") },
// Configuration
+#ifdef __APPLE__
+ { ctrl + ",", L("Preferences") },
+#else
{ ctrl + "P", L("Preferences") },
+#endif
// Help
{ "?", L("Show keyboard shortcuts list") }
};
diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp
index 8b8f1f6db..ca2b3d6c1 100644
--- a/src/slic3r/GUI/MainFrame.cpp
+++ b/src/slic3r/GUI/MainFrame.cpp
@@ -1074,7 +1074,9 @@ void MainFrame::on_sys_color_changed()
#ifdef _MSC_VER
// \xA0 is a non-breaking space. It is entered here to spoil the automatic accelerators,
// as the simple numeric accelerators spoil all numeric data entry.
-static const wxString sep = "\t\xA0";
+ // note: same for letters
+ // note: don't work anymore, it doesn't show them to the right. Revert to " - "
+static const wxString sep = " - ";//\t\xA0
static const wxString sep_space = "\xA0";
#else
static const wxString sep = " - ";
@@ -1129,7 +1131,7 @@ static wxMenu* generate_help_menu()
static void add_common_view_menu_items(wxMenu* view_menu, MainFrame* mainFrame, std::function<bool(void)> can_change_view)
{
- // The camera control accelerators are captured by GLCanvas3D::on_char().
+ // The camera control accelerators are captured by GLCanvas3D::on_char(). So be sure to don't activate the accelerator by using '\t'
append_menu_item(view_menu, wxID_ANY, _L("Iso") + sep + "&0", _L("Iso View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("iso"); },
"", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
view_menu->AppendSeparator();
@@ -1379,8 +1381,8 @@ void MainFrame::init_menubar_as_editor()
editMenu->AppendSeparator();
append_menu_item(editMenu, wxID_ANY, _L("Searc&h") + "\tCtrl+F",
- _L("Search in settings"), [this](wxCommandEvent&) { m_plater->search(/*m_tabpanel->GetCurrentPage() == */m_plater->IsShown()); },
- "search", nullptr, []() {return true; }, this);
+ _L("Search in settings"), [this](wxCommandEvent&) { m_plater->search(/*m_tabpanel->GetCurrentPage() == */m_plater->IsShown() && can_change_view()); },
+ "search", nullptr, []() { return true; }, this);
}
// Window menu
@@ -1425,9 +1427,9 @@ void MainFrame::init_menubar_as_editor()
viewMenu = new wxMenu();
add_common_view_menu_items(viewMenu, this, std::bind(&MainFrame::can_change_view, this));
viewMenu->AppendSeparator();
- append_menu_check_item(viewMenu, wxID_ANY, _L("Show &labels") + "\t" + "E", _L("Show object/instance labels in 3D scene"),
- [this](wxCommandEvent&) { m_plater->show_view3D_labels(!m_plater->are_view3D_labels_shown()); }, this,
- [this]() { return m_plater->is_view3D_shown() && can_change_view(); }, [this]() { return m_plater->are_view3D_labels_shown(); }, this);
+ append_menu_check_item(viewMenu, wxID_ANY, _L("Show &labels") + sep + "&e", _L("Show object/instance labels in 3D scene"),
+ [this](wxCommandEvent&) { m_plater->show_view3D_labels(!m_plater->are_view3D_labels_shown()); /* only called on clic, real event is handled by GLCanvas3D::on_char */ }, this,
+ [this]() { return m_plater->is_view3D_shown(); }, [this]() { return m_plater->are_view3D_labels_shown(); }, this);
append_menu_check_item(viewMenu, wxID_ANY, _L("&Collapse sidebar") + "\t" + "Shift+" + sep_space + "Tab", _L("Collapse sidebar"),
[this](wxCommandEvent&) { m_plater->collapse_sidebar(!m_plater->is_sidebar_collapsed()); }, this,
[this]() { return can_change_view(); }, [this]() { return m_plater->is_sidebar_collapsed(); }, this);
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index fd9084d11..3f01beaa6 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -5961,7 +5961,15 @@ void Plater::on_config_change(const DynamicPrintConfig &config)
{
bool update_scheduled = false;
bool bed_shape_changed = false;
+ auto diffs = p->config->diff(config);
for (auto opt_key : p->config->diff(config)) {
+ if (opt_key == "nozzle_diameter") {
+ if (p->config->option<ConfigOptionFloats>(opt_key)->values.size() > config.option<ConfigOptionFloats>(opt_key)->values.size()) {
+ //lower number of extuders, please don't try to display the old gcode.
+ p->reset_gcode_toolpaths();
+ p->gcode_result.reset();
+ }
+ }
if (opt_key == "filament_colour")
{
update_scheduled = true; // update should be scheduled (for update 3DScene) #2738
diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp
index 9cc2887b6..852121e80 100644
--- a/src/slic3r/GUI/PresetComboBoxes.cpp
+++ b/src/slic3r/GUI/PresetComboBoxes.cpp
@@ -128,13 +128,16 @@ PresetComboBox::PresetComboBox(wxWindow* parent, Preset::Type preset_type, const
// So, use GetSelection() from event parameter
auto selected_item = evt.GetSelection();
- auto marker = reinterpret_cast<Marker>(this->GetClientData(selected_item));
- if (marker >= LABEL_ITEM_DISABLED && marker < LABEL_ITEM_MAX)
- this->SetSelection(this->m_last_selected);
- else if (on_selection_changed && (m_last_selected != selected_item || m_collection->current_is_dirty())) {
- m_last_selected = selected_item;
- on_selection_changed(selected_item);
- evt.StopPropagation();
+ //protected as selected_item is often at a weird value
+ if (selected_item < this->GetCount() && selected_item >= 0) {
+ auto marker = reinterpret_cast<Marker>(this->GetClientData(selected_item));
+ if (marker >= LABEL_ITEM_DISABLED && marker < LABEL_ITEM_MAX)
+ this->SetSelection(this->m_last_selected);
+ else if (on_selection_changed && (m_last_selected != selected_item || m_collection->current_is_dirty())) {
+ m_last_selected = selected_item;
+ on_selection_changed(selected_item);
+ evt.StopPropagation();
+ }
}
evt.Skip();
});
@@ -451,6 +454,8 @@ wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, const std::string& m
bool PresetComboBox::is_selected_physical_printer()
{
auto selected_item = this->GetSelection();
+ if (selected_item >= this->GetCount() || selected_item < 0)
+ std::cout << "qfohadfh \n";
auto marker = reinterpret_cast<Marker>(this->GetClientData(selected_item));
return marker == LABEL_ITEM_PHYSICAL_PRINTER;
}
@@ -572,6 +577,8 @@ PlaterPresetComboBox::PlaterPresetComboBox(wxWindow *parent, Preset::Type preset
Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &evt) {
auto selected_item = evt.GetSelection();
+ if (selected_item >= this->GetCount() || selected_item < 0)
+ std::cout << "qfoshiofh \n";
auto marker = reinterpret_cast<Marker>(this->GetClientData(selected_item));
if (marker >= LABEL_ITEM_MARKER && marker < LABEL_ITEM_MAX) {
this->SetSelection(this->m_last_selected);
@@ -696,7 +703,14 @@ bool PlaterPresetComboBox::switch_to_tab()
wxGetApp().tab_panel()->SetSelection(page_id);
// Switch to Settings NotePad
- wxGetApp().mainframe->select_tab(MainFrame::ETabType::LastSettings);
+ if(m_type == Preset::Type::TYPE_PRINT || m_type == Preset::Type::TYPE_SLA_PRINT)
+ wxGetApp().mainframe->select_tab(MainFrame::ETabType::PrintSettings);
+ else if (m_type == Preset::Type::TYPE_FILAMENT || m_type == Preset::Type::TYPE_SLA_MATERIAL)
+ wxGetApp().mainframe->select_tab(MainFrame::ETabType::FilamentSettings);
+ else if (m_type == Preset::Type::TYPE_PRINTER)
+ wxGetApp().mainframe->select_tab(MainFrame::ETabType::PrinterSettings);
+ else
+ wxGetApp().mainframe->select_tab(MainFrame::ETabType::LastSettings);
return true;
}
@@ -912,7 +926,8 @@ TabPresetComboBox::TabPresetComboBox(wxWindow* parent, Preset::Type preset_type)
// m_presets_choice->GetSelection() will return first item, because search in PopupListCtrl is case-insensitive.
// So, use GetSelection() from event parameter
auto selected_item = evt.GetSelection();
-
+ if (selected_item >= this->GetCount() || selected_item < 0)
+ std::cout << "qfoazfhasuiofh \n";
auto marker = reinterpret_cast<Marker>(this->GetClientData(selected_item));
if (marker >= LABEL_ITEM_DISABLED && marker < LABEL_ITEM_MAX) {
this->SetSelection(this->m_last_selected);