From dc927717c27e786849978d37776a6473dad57b88 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 13 Oct 2022 23:45:21 +0200 Subject: [PATCH] Multi-selection in properties dialog: bugfixing and finalization --- src/ant/ant/antPropertiesPage.cc | 4 +- src/edt/edt/edtInstPropertiesPage.cc | 65 ++++++++++++++++++-------- src/edt/edt/edtInstPropertiesPage.h | 2 +- src/edt/edt/edtPropertiesPages.cc | 45 +++++++++++------- src/edt/edt/edtPropertiesPages.h | 2 +- src/edt/edt/edtService.cc | 32 +++++++++---- src/edt/edt/edtService.h | 15 ++++-- src/img/img/imgPropertiesPage.cc | 2 +- src/laybasic/laybasic/layProperties.h | 1 - src/layui/layui/layPropertiesDialog.cc | 53 +++++++++++---------- src/layui/layui/layPropertiesDialog.h | 2 +- 11 files changed, 141 insertions(+), 82 deletions(-) diff --git a/src/ant/ant/antPropertiesPage.cc b/src/ant/ant/antPropertiesPage.cc index 61bc261ae..4037d5442 100644 --- a/src/ant/ant/antPropertiesPage.cc +++ b/src/ant/ant/antPropertiesPage.cc @@ -377,7 +377,7 @@ PropertiesPage::count () const void PropertiesPage::select_entries (const std::vector &entries) { - tl_assert (entries.size () == 1); // @@@ + tl_assert (entries.size () == 1); m_index = entries.front (); } @@ -523,7 +523,7 @@ PropertiesPage::apply () { ant::Object obj; get_object (obj); - mp_rulers->change_ruler (m_selection [m_index], obj); // @@@ multi-apply + mp_rulers->change_ruler (m_selection [m_index], obj); } void PropertiesPage::get_object(ant::Object &obj) diff --git a/src/edt/edt/edtInstPropertiesPage.cc b/src/edt/edt/edtInstPropertiesPage.cc index 5721acfbb..ce5c0d14e 100644 --- a/src/edt/edt/edtInstPropertiesPage.cc +++ b/src/edt/edt/edtInstPropertiesPage.cc @@ -61,7 +61,6 @@ InstPropertiesPage::InstPropertiesPage (edt::Service *service, db::Manager *mana for (edt::Service::obj_iterator s = service->selection ().begin (); s != service->selection ().end (); ++s) { m_selection_ptrs.push_back (s); } - m_index = 0; m_prop_id = 0; mp_service->clear_highlights (); @@ -156,6 +155,10 @@ get_cell_or_pcell_ids_by_name (const db::Layout *layout, const std::string &name void InstPropertiesPage::browse_cell () { + if (m_indexes.empty ()) { + return; + } + BEGIN_PROTECTED // find the layout the cell has to be looked up: that is either the layout of the current instance or @@ -166,7 +169,7 @@ BEGIN_PROTECTED lib = lib_cbx->current_library (); layout = &lib->layout (); } else { - edt::Service::obj_iterator pos = m_selection_ptrs [m_index]; + edt::Service::obj_iterator pos = m_selection_ptrs [m_indexes.front ()]; const lay::CellView &cv = mp_service->view ()->cellview (pos->cv_index ()); layout = &cv->layout (); } @@ -207,8 +210,12 @@ END_PROTECTED void InstPropertiesPage::show_props () { + if (m_indexes.empty ()) { + return; + } + lay::UserPropertiesForm props_form (this); - if (props_form.show (mp_service->view (), m_selection_ptrs [m_index]->cv_index (), m_prop_id)) { + if (props_form.show (mp_service->view (), m_selection_ptrs [m_indexes.front ()]->cv_index (), m_prop_id)) { emit edited (); } } @@ -235,8 +242,7 @@ InstPropertiesPage::count () const void InstPropertiesPage::select_entries (const std::vector &entries) { - tl_assert (entries.size () == 1); // @@@ - m_index = entries.front (); + m_indexes = entries; } std::string @@ -296,10 +302,14 @@ InstPropertiesPage::leave () void InstPropertiesPage::update () { - edt::Service::obj_iterator pos = m_selection_ptrs [m_index]; + if (m_indexes.empty ()) { + return; + } + + edt::Service::obj_iterator pos = m_selection_ptrs [m_indexes.front ()]; tl_assert (pos->is_cell_inst ()); - mp_service->highlight (m_index); + mp_service->highlight (m_indexes); m_enable_cb_callback = false; dbu_cb->setChecked (mp_service->view ()->dbu_coordinates ()); @@ -407,7 +417,11 @@ InstPropertiesPage::update () void InstPropertiesPage::show_cell () { - edt::Service::obj_iterator pos = m_selection_ptrs [m_index]; + if (m_indexes.empty ()) { + return; + } + + edt::Service::obj_iterator pos = m_selection_ptrs [m_indexes.front ()]; lay::CellView::unspecific_cell_path_type path (mp_service->view ()->cellview (pos->cv_index ()).combined_unspecific_path ()); for (lay::ObjectInstPath::iterator p = pos->begin (); p != pos->end (); ++p) { @@ -420,8 +434,12 @@ InstPropertiesPage::show_cell () void InstPropertiesPage::show_inst () { + if (m_indexes.empty ()) { + return; + } + InstantiationForm inst_form (this); - inst_form.show (mp_service->view (), *m_selection_ptrs [m_index]); + inst_form.show (mp_service->view (), *m_selection_ptrs [m_indexes.front ()]); } bool @@ -433,12 +451,14 @@ InstPropertiesPage::readonly () ChangeApplicator * InstPropertiesPage::create_applicator (db::Cell & /*cell*/, const db::Instance & /*inst*/, double dbu) { + tl_assert (! m_indexes.empty ()); + bool has_error = false; bool has_pcell_error = false; std::unique_ptr appl (new CombinedChangeApplicator ()); - edt::Service::obj_iterator pos = m_selection_ptrs [m_index]; + edt::Service::obj_iterator pos = m_selection_ptrs [m_indexes.front ()]; const lay::CellView &cv = mp_service->view ()->cellview (pos->cv_index ()); bool du = dbu_cb->isChecked (); @@ -732,13 +752,17 @@ InstPropertiesPage::recompute_selection_ptrs (const std::vectorview ()->layer_snapshot (); - unsigned int cv_index = m_selection_ptrs [m_index]->cv_index (); + unsigned int cv_index = m_selection_ptrs [m_indexes.front ()]->cv_index (); std::unique_ptr applicator; { - edt::Service::obj_iterator pos = m_selection_ptrs [m_index]; + edt::Service::obj_iterator pos = m_selection_ptrs [m_indexes.front ()]; tl_assert (pos->is_cell_inst ()); const lay::CellView &cv = mp_service->view ()->cellview (pos->cv_index ()); @@ -766,7 +790,7 @@ InstPropertiesPage::do_apply (bool current_only, bool relative) // But it avoids issues with duplicate selections of the same instance which may happen when // an instance is selected multiple times through different hierarchy branches. - db::Instance current = m_selection_ptrs [m_index]->back ().inst_ptr; + db::Instance current = m_selection_ptrs [m_indexes.front ()]->back ().inst_ptr; std::vector new_sel; new_sel.reserve (m_selection_ptrs.size ()); @@ -780,9 +804,10 @@ InstPropertiesPage::do_apply (bool current_only, bool relative) try { - for (std::vector::const_iterator p = m_selection_ptrs.begin (); p != m_selection_ptrs.end (); ++p) { + for (auto ii = m_indexes.begin (); ii != m_indexes.end (); ++ii) { - edt::Service::obj_iterator pos = *p; + size_t index = *ii; + edt::Service::obj_iterator pos = m_selection_ptrs [*ii]; // only update objects from the same layout - this is not practical limitation but saves a lot of effort for // managing different property id's etc. @@ -815,8 +840,6 @@ InstPropertiesPage::do_apply (bool current_only, bool relative) if (new_inst != pos->back ().inst_ptr) { - size_t index = p - m_selection_ptrs.begin (); - // change selection to new instance new_sel[index].back ().inst_ptr = new_inst; @@ -869,6 +892,10 @@ InstPropertiesPage::apply_to_all (bool relative) void InstPropertiesPage::update_pcell_parameters () { + if (m_indexes.empty ()) { + return; + } + db::Layout *layout; // find the layout the cell has to be looked up: that is either the layout of the current instance or @@ -879,7 +906,7 @@ InstPropertiesPage::update_pcell_parameters () } else { - edt::Service::obj_iterator pos = m_selection_ptrs [m_index]; + edt::Service::obj_iterator pos = m_selection_ptrs [m_indexes.front ()]; const lay::CellView &cv = mp_service->view ()->cellview (pos->cv_index ()); layout = &cv->layout (); @@ -903,7 +930,7 @@ InstPropertiesPage::update_pcell_parameters () std::vector parameters; - edt::Service::obj_iterator pos = m_selection_ptrs [m_index]; + edt::Service::obj_iterator pos = m_selection_ptrs [m_indexes.front ()]; const lay::CellView &cv = mp_service->view ()->cellview (pos->cv_index ()); db::Cell &cell = cv->layout ().cell (pos->cell_index ()); std::pair pci = cell.is_pcell_instance (pos->back ().inst_ptr); diff --git a/src/edt/edt/edtInstPropertiesPage.h b/src/edt/edt/edtInstPropertiesPage.h index 5765f37a0..3e124161d 100644 --- a/src/edt/edt/edtInstPropertiesPage.h +++ b/src/edt/edt/edtInstPropertiesPage.h @@ -59,7 +59,7 @@ private: protected: std::vector m_selection_ptrs; - unsigned int m_index; + std::vector m_indexes; edt::Service *mp_service; bool m_enable_cb_callback; db::properties_id_type m_prop_id; diff --git a/src/edt/edt/edtPropertiesPages.cc b/src/edt/edt/edtPropertiesPages.cc index d831d17fe..4377281e2 100644 --- a/src/edt/edt/edtPropertiesPages.cc +++ b/src/edt/edt/edtPropertiesPages.cc @@ -51,7 +51,6 @@ ShapePropertiesPage::ShapePropertiesPage (const std::string &description, edt::S for (edt::Service::obj_iterator s = service->selection ().begin (); s != service->selection ().end (); ++s) { m_selection_ptrs.push_back (s); } - m_index = 0; m_prop_id = 0; mp_service->clear_highlights (); } @@ -82,8 +81,7 @@ ShapePropertiesPage::count () const void ShapePropertiesPage::select_entries (const std::vector &entries) { - tl_assert (entries.size () == 1); // @@@ - m_index = entries.front (); + m_indexes = entries; } lay::LayoutViewBase * @@ -166,8 +164,8 @@ ShapePropertiesPage::abs_trans () const db::ICplxTrans ShapePropertiesPage::trans () const { - if (abs_trans ()) { - return m_selection_ptrs[m_index]->trans (); + if (abs_trans () && ! m_indexes.empty ()) { + return m_selection_ptrs[m_indexes.front ()]->trans (); } else { return db::ICplxTrans (); } @@ -190,7 +188,7 @@ END_PROTECTED void ShapePropertiesPage::update () { - mp_service->highlight (m_index); + mp_service->highlight (m_indexes); update_shape (); } @@ -215,12 +213,16 @@ ShapePropertiesPage::recompute_selection_ptrs (const std::vector applicator; - unsigned int cv_index = m_selection_ptrs [m_index]->cv_index (); + unsigned int cv_index = m_selection_ptrs [m_indexes.front ()]->cv_index (); { - edt::Service::obj_iterator pos = m_selection_ptrs [m_index]; + edt::Service::obj_iterator pos = m_selection_ptrs [m_indexes.front ()]; tl_assert (! pos->is_cell_inst ()); const lay::CellView &cv = mp_service->view ()->cellview (pos->cv_index ()); @@ -249,7 +251,7 @@ ShapePropertiesPage::do_apply (bool current_only, bool relative) // But it avoids issues with duplicate selections of the same shape which may happen when // a shape is selected multiple times through different hierarchy branches. - db::Shape current = m_selection_ptrs [m_index]->shape (); + db::Shape current = m_selection_ptrs [m_indexes.front ()]->shape (); std::vector new_sel; new_sel.reserve (m_selection_ptrs.size ()); @@ -263,11 +265,10 @@ ShapePropertiesPage::do_apply (bool current_only, bool relative) try { - for (std::vector::const_iterator p = m_selection_ptrs.begin (); p != m_selection_ptrs.end (); ++p) { + for (auto i = m_indexes.begin (); i != m_indexes.end (); ++i) { - size_t index = p - m_selection_ptrs.begin (); - - edt::Service::obj_iterator pos = *p; + size_t index = *i; + edt::Service::obj_iterator pos = m_selection_ptrs [*i]; // only update objects from the same layout - this is not practical limitation but saves a lot of effort for // managing different property id's etc. @@ -365,7 +366,11 @@ ShapePropertiesPage::apply_to_all (bool relative) void ShapePropertiesPage::update_shape () { - edt::Service::obj_iterator pos = m_selection_ptrs [m_index]; + if (m_indexes.empty ()) { + return; + } + + edt::Service::obj_iterator pos = m_selection_ptrs [m_indexes.front ()]; const lay::CellView &cv = mp_service->view ()->cellview (pos->cv_index ()); double dbu = cv->layout ().dbu (); @@ -397,15 +402,23 @@ ShapePropertiesPage::update_shape () void ShapePropertiesPage::show_inst () { + if (m_indexes.empty ()) { + return; + } + InstantiationForm inst_form (this); - inst_form.show (mp_service->view (), *m_selection_ptrs [m_index]); + inst_form.show (mp_service->view (), *m_selection_ptrs [m_indexes.front ()]); } void ShapePropertiesPage::show_props () { + if (m_indexes.empty ()) { + return; + } + lay::UserPropertiesForm props_form (this); - if (props_form.show (mp_service->view (), m_selection_ptrs [m_index]->cv_index (), m_prop_id)) { + if (props_form.show (mp_service->view (), m_selection_ptrs [m_indexes.front ()]->cv_index (), m_prop_id)) { emit edited (); } } diff --git a/src/edt/edt/edtPropertiesPages.h b/src/edt/edt/edtPropertiesPages.h index 36f1785f1..834da0fb2 100644 --- a/src/edt/edt/edtPropertiesPages.h +++ b/src/edt/edt/edtPropertiesPages.h @@ -70,7 +70,7 @@ private: protected: std::string m_description; std::vector m_selection_ptrs; - unsigned int m_index; + std::vector m_indexes; edt::Service *mp_service; bool m_enable_cb_callback; db::properties_id_type m_prop_id; diff --git a/src/edt/edt/edtService.cc b/src/edt/edt/edtService.cc index e49d0248b..ae5a4dcb7 100644 --- a/src/edt/edt/edtService.cc +++ b/src/edt/edt/edtService.cc @@ -77,6 +77,7 @@ Service::Service (db::Manager *manager, lay::LayoutViewBase *view, db::ShapeIter m_hier_copy_mode (-1), m_indicate_secondary_selection (false), m_seq (0), + m_highlights_selected (false), dm_selection_to_view (this, &edt::Service::do_selection_to_view) { mp_view->geom_changed_event.add (this, &edt::Service::selection_to_view); @@ -97,6 +98,7 @@ Service::Service (db::Manager *manager, lay::LayoutViewBase *view) m_hier_copy_mode (-1), m_indicate_secondary_selection (false), m_seq (0), + m_highlights_selected (false), dm_selection_to_view (this, &edt::Service::do_selection_to_view) { mp_view->geom_changed_event.add (this, &edt::Service::selection_to_view); @@ -271,28 +273,36 @@ Service::configure (const std::string &name, const std::string &value) void Service::clear_highlights () { - for (std::vector::iterator r = m_markers.begin (); r != m_markers.end (); ++r) { - (*r)->visible (false); - } + m_highlights_selected = true; + m_selected_highlights.clear (); + apply_highlights (); } void Service::restore_highlights () { - for (std::vector::iterator r = m_markers.begin (); r != m_markers.end (); ++r) { - (*r)->visible (true); - } + m_highlights_selected = false; + m_selected_highlights.clear (); + apply_highlights (); } -void -Service::highlight (unsigned int n) +void +Service::highlight (const std::vector &n) +{ + m_highlights_selected = true; + m_selected_highlights = std::set (n.begin (), n.end ()); + apply_highlights (); +} + +void +Service::apply_highlights () { for (std::vector::iterator r = m_markers.begin (); r != m_markers.end (); ++r) { - (*r)->visible (n-- == 0); + (*r)->visible (! m_highlights_selected || m_selected_highlights.find (r - m_markers.begin ()) != m_selected_highlights.end ()); } } -void +void Service::cut () { if (has_selection () && view ()->is_editable ()) { @@ -1597,6 +1607,8 @@ Service::do_selection_to_view () } } + + apply_highlights (); } void diff --git a/src/edt/edt/edtService.h b/src/edt/edt/edtService.h index 81f3ea400..26c56b150 100644 --- a/src/edt/edt/edtService.h +++ b/src/edt/edt/edtService.h @@ -105,10 +105,10 @@ public: */ void restore_highlights (); - /** - * @brief Highlight a certain object + /** + * @brief Highlights a group of objects */ - void highlight (unsigned int n); + void highlight (const std::vector &n); /** * @brief "delete" operation @@ -616,6 +616,10 @@ private: bool m_indicate_secondary_selection; unsigned long m_seq; + // selective highlights + bool m_highlights_selected; + std::set m_selected_highlights; + // Deferred method to update the selection tl::DeferredMethod dm_selection_to_view; @@ -646,6 +650,11 @@ private: */ void display_status (bool transient); + /** + * @brief Apply highlight selection + */ + void apply_highlights (); + private: void copy_selected (unsigned int inst_mode); }; diff --git a/src/img/img/imgPropertiesPage.cc b/src/img/img/imgPropertiesPage.cc index 0ad8781e0..cdabae0cd 100644 --- a/src/img/img/imgPropertiesPage.cc +++ b/src/img/img/imgPropertiesPage.cc @@ -163,7 +163,7 @@ PropertiesPage::count () const void PropertiesPage::select_entries (const std::vector &entries) { - tl_assert (entries.size () == 1); // @@@ + tl_assert (entries.size () == 1); m_index = entries.front (); invalidate (); } diff --git a/src/laybasic/laybasic/layProperties.h b/src/laybasic/laybasic/layProperties.h index cea5288dc..081a171b3 100644 --- a/src/laybasic/laybasic/layProperties.h +++ b/src/laybasic/laybasic/layProperties.h @@ -162,7 +162,6 @@ public: /** * @brief Returns true, if the properties page supports "apply all" - * @@@ TODO: remove */ virtual bool can_apply_to_all () const { diff --git a/src/layui/layui/layPropertiesDialog.cc b/src/layui/layui/layPropertiesDialog.cc index 6b2be8dfc..24550dafd 100644 --- a/src/layui/layui/layPropertiesDialog.cc +++ b/src/layui/layui/layPropertiesDialog.cc @@ -58,14 +58,14 @@ public: if (role == Qt::DisplayRole) { if (index.internalId () < mp_dialog->properties_pages ().size ()) { return tl::to_qstring (mp_dialog->properties_pages () [index.internalId ()]->description (index.row ())); - } else { + } else if (index.row () < int (mp_dialog->properties_pages ().size ())) { return tl::to_qstring (mp_dialog->properties_pages () [index.row ()]->description ()); } } else if (role == Qt::DecorationRole) { QIcon icon; if (index.internalId () < mp_dialog->properties_pages ().size ()) { icon = mp_dialog->properties_pages () [index.internalId ()]->icon (index.row (), m_icon_width, m_icon_height); - } else { + } else if (index.row () < int (mp_dialog->properties_pages ().size ())) { icon = mp_dialog->properties_pages () [index.row ()]->icon (m_icon_width, m_icon_height); } if (! icon.isNull ()) { @@ -217,13 +217,16 @@ PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager, mp_ui->tree->header()->setSectionResizeMode (QHeaderView::ResizeToContents); mp_ui->tree->expandAll (); + if (mp_properties_pages.empty ()) { + mp_ui->tree->hide (); + } + m_signals_enabled = false; mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, 0)); m_signals_enabled = true; update_controls (); -// @@@ save this status! mp_ui->apply_to_all_cbx->setChecked (false); mp_ui->relative_cbx->setChecked (true); @@ -262,7 +265,7 @@ PropertiesDialog::apply_to_all_pressed () if (mp_ui->apply_to_all_cbx->isChecked ()) { mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index)); } else if (! m_object_indexes.empty ()) { - mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, m_object_indexes.front ())); + mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, int (m_object_indexes.front ()))); } m_signals_enabled = true; } @@ -294,21 +297,21 @@ PropertiesDialog::current_index_changed (const QModelIndex &index, const QModelI if (mp_properties_pages [m_index]->can_apply_to_all ()) { - m_object_indexes.push_back (mp_tree_model->object_index (index)); + m_object_indexes.push_back (size_t (mp_tree_model->object_index (index))); auto selection = mp_ui->tree->selectionModel ()->selectedIndexes (); for (auto i = selection.begin (); i != selection.end (); ++i) { if (mp_tree_model->parent (*i).isValid () && mp_tree_model->page_index (*i) == m_index) { int oi = mp_tree_model->object_index (*i); - if (oi != m_object_indexes.front ()) { - m_object_indexes.push_back (oi); + if (oi != int (m_object_indexes.front ())) { + m_object_indexes.push_back (size_t (oi)); } } } } else { - m_object_indexes.push_back (mp_tree_model->object_index (index)); + m_object_indexes.push_back (size_t (mp_tree_model->object_index (index))); } @@ -317,8 +320,16 @@ PropertiesDialog::current_index_changed (const QModelIndex &index, const QModelI m_index = index.row (); mp_ui->apply_to_all_cbx->setChecked (mp_properties_pages [m_index]->can_apply_to_all ()); - for (int oi = 0; oi < mp_properties_pages [m_index]->count (); ++oi) { - m_object_indexes.push_back (oi); + if (mp_properties_pages [m_index]->can_apply_to_all ()) { + + for (size_t oi = 0; oi < mp_properties_pages [m_index]->count (); ++oi) { + m_object_indexes.push_back (oi); + } + + } else { + + m_object_indexes.push_back (size_t (mp_tree_model->object_index (index))); + } } @@ -330,7 +341,7 @@ PropertiesDialog::current_index_changed (const QModelIndex &index, const QModelI for (int i = 0; i < m_index; ++i) { m_current_object += mp_properties_pages [i]->count (); } - m_current_object += m_object_indexes.front (); + m_current_object += int (m_object_indexes.front ()); } else { m_current_object = -1; } @@ -373,7 +384,7 @@ PropertiesDialog::update_controls () mp_ui->ok_button->setEnabled (! mp_properties_pages [m_index]->readonly ()); mp_ui->tree->setEnabled (true); - mp_properties_pages [m_index]->select_entry (m_object_indexes); + mp_properties_pages [m_index]->select_entries (m_object_indexes); mp_properties_pages [m_index]->update (); } @@ -397,7 +408,7 @@ BEGIN_PROTECTED } // advance the current entry - int object_index = m_object_indexes.front (); + int object_index = int (m_object_indexes.front ()); ++object_index; // look for next usable editable if at end @@ -445,7 +456,7 @@ BEGIN_PROTECTED } // advance the current entry - int object_index = m_object_indexes.front (); + int object_index = int (m_object_indexes.front ()); if (object_index == 0) { // look for last usable editable if at end @@ -494,15 +505,9 @@ PropertiesDialog::any_next () const return false; } - // look for the next applicable page - // @@@ Pages should not be empty int index = m_index; - if (m_object_indexes.front () + 1 >= int (mp_properties_pages [index]->count ())) { + if (m_object_indexes.front () + 1 >= mp_properties_pages [index]->count ()) { ++index; - while (index < int (mp_properties_pages.size ()) && - (mp_properties_pages [index] == 0 || mp_properties_pages [index]->count () == 0)) { - ++index; - } } // return true, if not at end @@ -516,15 +521,9 @@ PropertiesDialog::any_prev () const return false; } - // look for the next applicable page - // @@@ Pages should not be empty int index = m_index; if (m_object_indexes.front () == 0) { --index; - while (index >= 0 && - (mp_properties_pages [index] == 0 || mp_properties_pages [index]->count () == 0)) { - --index; - } } // return true, if not at the beginning diff --git a/src/layui/layui/layPropertiesDialog.h b/src/layui/layui/layPropertiesDialog.h index d3ba05efa..ee396ec8f 100644 --- a/src/layui/layui/layPropertiesDialog.h +++ b/src/layui/layui/layPropertiesDialog.h @@ -86,7 +86,7 @@ private: db::Manager *mp_manager; lay::Editables *mp_editables; int m_index, m_prev_index; - std::vector m_object_indexes; + std::vector m_object_indexes; QStackedLayout *mp_stack; QLabel *mp_none; lay::MainWindow *mp_mw;