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

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuSanka <yusanka@gmail.com>2019-12-11 18:07:00 +0300
committerYuSanka <yusanka@gmail.com>2019-12-11 18:07:00 +0300
commitd66761e030c289508e028154872fab0d96b37f7e (patch)
treedcd33f830a44eaf8c8b1d0c167e78c053d573064 /src/slic3r/GUI/GUI_ObjectList.cpp
parentbced486db342b94e7ba4e20231d6187e428bb97b (diff)
Fixed wrong context menu selection for instance(s). Related to #3275
Diffstat (limited to 'src/slic3r/GUI/GUI_ObjectList.cpp')
-rw-r--r--src/slic3r/GUI/GUI_ObjectList.cpp108
1 files changed, 75 insertions, 33 deletions
diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp
index 1011bfd5e..a1f06de31 100644
--- a/src/slic3r/GUI/GUI_ObjectList.cpp
+++ b/src/slic3r/GUI/GUI_ObjectList.cpp
@@ -59,6 +59,11 @@ static PrinterTechnology printer_technology()
return wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology();
}
+static const Selection& scene_selection()
+{
+ return wxGetApp().plater()->canvas3D()->get_selection();
+}
+
// Config from current edited printer preset
static DynamicPrintConfig& printer_config()
{
@@ -1312,7 +1317,10 @@ void ObjectList::get_settings_choice(const wxString& category_name)
void ObjectList::get_freq_settings_choice(const wxString& bundle_name)
{
std::vector<std::string> options = get_options_for_bundle(bundle_name);
- wxDataViewItem item = GetSelection();
+ const Selection& selection = scene_selection();
+ wxDataViewItem item = GetSelectedItemsCount() > 1 && selection.is_single_full_object() ?
+ m_objects_model->GetItemById(selection.get_object_idx()) :
+ GetSelection();
ItemType item_type = m_objects_model->GetItemType(item);
@@ -1400,17 +1408,23 @@ void ObjectList::append_menu_items_add_volume(wxMenu* menu)
const ConfigOptionMode mode = wxGetApp().get_mode();
+ wxWindow* parent = wxGetApp().plater();
+
if (mode == comAdvanced) {
append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].first), "",
- [this](wxCommandEvent&) { load_subobject(ModelVolumeType::MODEL_PART); }, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].second);
+ [this](wxCommandEvent&) { load_subobject(ModelVolumeType::MODEL_PART); },
+ ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].second, nullptr,
+ [this]() { return is_instance_or_object_selected(); }, parent);
}
if (mode == comSimple) {
append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER)].first), "",
[this](wxCommandEvent&) { load_generic_subobject(L("Box"), ModelVolumeType::SUPPORT_ENFORCER); },
- ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER)].second);
+ ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER)].second, nullptr,
+ [this]() { return is_instance_or_object_selected(); }, parent);
append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER)].first), "",
[this](wxCommandEvent&) { load_generic_subobject(L("Box"), ModelVolumeType::SUPPORT_BLOCKER); },
- ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER)].second);
+ ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER)].second, nullptr,
+ [this]() { return is_instance_or_object_selected(); }, parent);
return;
}
@@ -1420,7 +1434,8 @@ void ObjectList::append_menu_items_add_volume(wxMenu* menu)
auto& item = ADD_VOLUME_MENU_ITEMS[type];
wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType(type));
- append_submenu(menu, sub_menu, wxID_ANY, _(item.first), "", item.second);
+ append_submenu(menu, sub_menu, wxID_ANY, _(item.first), "", item.second,
+ [this]() { return is_instance_or_object_selected(); }, parent);
}
}
@@ -1431,10 +1446,17 @@ wxMenuItem* ObjectList::append_menu_item_split(wxMenu* menu)
[this]() { return is_splittable(); }, wxGetApp().plater());
}
-wxMenuItem* ObjectList::append_menu_item_layers_editing(wxMenu* menu)
+bool ObjectList::is_instance_or_object_selected()
+{
+ const Selection& selection = scene_selection();
+ return selection.is_single_full_instance() || selection.is_single_full_object();
+}
+
+wxMenuItem* ObjectList::append_menu_item_layers_editing(wxMenu* menu, wxWindow* parent)
{
return append_menu_item(menu, wxID_ANY, _(L("Height range Modifier")), "",
- [this](wxCommandEvent&) { layers_editing(); }, "edit_layers_all", menu);
+ [this](wxCommandEvent&) { layers_editing(); }, "edit_layers_all", menu,
+ [this]() { return is_instance_or_object_selected(); }, parent);
}
wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_)
@@ -1475,6 +1497,12 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_)
#endif
menu->DestroySeparators(); // delete old separators
+ // If there are selected more then one instance but not all of them
+ // don't add settings menu items
+ const Selection& selection = scene_selection();
+ if (selection.is_multiple_full_instance() && !selection.is_single_full_object())
+ return nullptr;
+
const auto sel_vol = get_selected_model_volume();
if (sel_vol && sel_vol->type() >= ModelVolumeType::SUPPORT_ENFORCER)
return nullptr;
@@ -1490,7 +1518,8 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_)
menu->SetFirstSeparator();
// Add frequently settings
- const bool is_object_settings = m_objects_model->GetItemType(GetSelection()) == itObject;
+ const ItemType item_type = m_objects_model->GetItemType(GetSelection());
+ const bool is_object_settings = item_type & itObject || item_type & itInstance || selection.is_single_full_object();
create_freq_settings_popupmenu(menu, is_object_settings);
if (mode == comAdvanced)
@@ -1516,15 +1545,35 @@ wxMenuItem* ObjectList::append_menu_item_change_type(wxMenu* menu)
wxMenuItem* ObjectList::append_menu_item_instance_to_object(wxMenu* menu, wxWindow* parent)
{
- return append_menu_item(menu, wxID_ANY, _(L("Set as a Separated Object")), "",
+ wxMenuItem* menu_item = append_menu_item(menu, wxID_ANY, _(L("Set as a Separated Object")), "",
[this](wxCommandEvent&) { split_instances(); }, "", menu, [](){return wxGetApp().plater()->can_set_instance_to_object(); }, parent);
+
+ /* New behavior logic:
+ * 1. Split Object to several separated object, if ALL instances are selected
+ * 2. Separate selected instances from the initial object to the separated object,
+ * if some (not all) instances are selected
+ */
+ parent->Bind(wxEVT_UPDATE_UI, [](wxUpdateUIEvent& evt) {
+ evt.SetText(wxGetApp().plater()->canvas3D()->get_selection().is_single_full_object() ?
+ _(L("Set as a Separated Objects")) : _(L("Set as a Separated Object")));
+ }, menu_item->GetId());
+
+ return menu_item;
}
wxMenuItem* ObjectList::append_menu_item_printable(wxMenu* menu, wxWindow* /*parent*/)
{
- return append_menu_check_item(menu, wxID_ANY, _(L("Printable")), "", [](wxCommandEvent&) {
- wxGetApp().plater()->canvas3D()->get_selection().toggle_instance_printable_state();
- }, menu);
+ return append_menu_check_item(menu, wxID_ANY, _(L("Printable")), "", [this](wxCommandEvent&) {
+ const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection();
+ wxDataViewItem item;
+ if (GetSelectedItemsCount() > 1 && selection.is_single_full_object())
+ item = m_objects_model->GetItemById(selection.get_object_idx());
+ else
+ item = GetSelection();
+
+ if (item)
+ toggle_printable_state(item);
+ }, menu);
}
void ObjectList::append_menu_items_osx(wxMenu* menu)
@@ -1620,7 +1669,7 @@ void ObjectList::create_object_popupmenu(wxMenu *menu)
menu->AppendSeparator();
// Layers Editing for object
- append_menu_item_layers_editing(menu);
+ append_menu_item_layers_editing(menu, wxGetApp().plater());
menu->AppendSeparator();
// rest of a object_menu will be added later in:
@@ -1664,17 +1713,6 @@ void ObjectList::create_part_popupmenu(wxMenu *menu)
void ObjectList::create_instance_popupmenu(wxMenu*menu)
{
m_menu_item_split_instances = append_menu_item_instance_to_object(menu, wxGetApp().plater());
-
- /* New behavior logic:
- * 1. Split Object to several separated object, if ALL instances are selected
- * 2. Separate selected instances from the initial object to the separated object,
- * if some (not all) instances are selected
- */
- wxGetApp().plater()->Bind(wxEVT_UPDATE_UI, [](wxUpdateUIEvent& evt) {
-// evt.Enable(can_split_instances()); }, m_menu_item_split_instances->GetId());
- evt.SetText(wxGetApp().plater()->canvas3D()->get_selection().is_single_full_object() ?
- _(L("Set as a Separated Objects")) : _(L("Set as a Separated Object")));
- }, m_menu_item_split_instances->GetId());
}
void ObjectList::create_default_popupmenu(wxMenu*menu)
@@ -1688,7 +1726,7 @@ wxMenu* ObjectList::create_settings_popupmenu(wxMenu *parent_menu)
wxMenu *menu = new wxMenu;
settings_menu_hierarchy settings_menu;
- const bool is_part = m_objects_model->GetParent(GetSelection()) != wxDataViewItem(nullptr);
+ const bool is_part = !(m_objects_model->GetItemType(GetSelection()) == itObject || scene_selection().is_single_full_object());
get_options_menu(settings_menu, is_part);
for (auto cat : settings_menu) {
@@ -1857,7 +1895,7 @@ void ObjectList::load_generic_subobject(const std::string& type_name, const Mode
if (obj_idx < 0)
return;
- const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection();
+ const Selection& selection = scene_selection();
assert(obj_idx == selection.get_object_idx());
/** Any changes of the Object's composition is duplicated for all Object's Instances
@@ -2182,9 +2220,13 @@ void ObjectList::split()
void ObjectList::layers_editing()
{
- const auto item = GetSelection();
- const int obj_idx = get_selected_obj_idx();
- if (!item || obj_idx < 0)
+ const Selection& selection = scene_selection();
+ const int obj_idx = selection.get_object_idx();
+ wxDataViewItem item = obj_idx >= 0 && GetSelectedItemsCount() > 1 && selection.is_single_full_object() ?
+ m_objects_model->GetItemById(obj_idx) :
+ GetSelection();
+
+ if (!item)
return;
const wxDataViewItem obj_item = m_objects_model->GetTopParent(item);
@@ -2297,7 +2339,7 @@ bool ObjectList::selected_instances_of_same_object()
bool ObjectList::can_split_instances()
{
- const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection();
+ const Selection& selection = scene_selection();
return selection.is_multiple_full_instance() || selection.is_single_full_instance();
}
@@ -2325,7 +2367,7 @@ void ObjectList::part_selection_changed()
{
og_name = _(L("Group manipulation"));
- const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection();
+ const Selection& selection = scene_selection();
// don't show manipulation panel for case of all Object's parts selection
update_and_show_manipulations = !selection.is_single_full_instance();
}
@@ -2933,7 +2975,7 @@ int ObjectList::get_selected_layers_range_idx() const
void ObjectList::update_selections()
{
- const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection();
+ const Selection& selection = scene_selection();
wxDataViewItemArray sels;
if ( ( m_selection_mode & (smSettings|smLayer|smLayerRoot) ) == 0)
@@ -3640,7 +3682,7 @@ void ObjectList::instances_to_separated_objects(const int obj_idx)
void ObjectList::split_instances()
{
- const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection();
+ const Selection& selection = scene_selection();
const int obj_idx = selection.get_object_idx();
if (obj_idx == -1)
return;