diff --git a/src/layui/layui/PropertiesDialog.ui b/src/layui/layui/PropertiesDialog.ui index c0fac84df..10f1b72b1 100644 --- a/src/layui/layui/PropertiesDialog.ui +++ b/src/layui/layui/PropertiesDialog.ui @@ -26,6 +26,9 @@ 0 + + QAbstractItemView::ExtendedSelection + 16 diff --git a/src/layui/layui/layPropertiesDialog.cc b/src/layui/layui/layPropertiesDialog.cc index 295b17496..6b2be8dfc 100644 --- a/src/layui/layui/layPropertiesDialog.cc +++ b/src/layui/layui/layPropertiesDialog.cc @@ -159,7 +159,6 @@ PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager, mp_manager (manager), mp_editables (editables), m_index (0), m_prev_index (-1), - m_object_index (0), m_auto_applied (false), m_transaction_id (0), m_signals_enabled (true) @@ -206,6 +205,8 @@ PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager, // look for next usable editable if (m_index >= int (mp_properties_pages.size ())) { m_index = -1; + } else { + m_object_indexes.push_back (0); } update_title (); @@ -217,7 +218,7 @@ PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager, mp_ui->tree->expandAll (); m_signals_enabled = false; - mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, m_object_index)); + mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, 0)); m_signals_enabled = true; update_controls (); @@ -232,6 +233,7 @@ PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager, connect (mp_ui->next_button, SIGNAL (clicked ()), this, SLOT (next_pressed ())); connect (mp_ui->apply_to_all_cbx, SIGNAL (clicked ()), this, SLOT (apply_to_all_pressed ())); connect (mp_ui->tree->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (current_index_changed (const QModelIndex &, const QModelIndex &))); + connect (mp_ui->tree->selectionModel (), SIGNAL (selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT (selection_changed ())); } PropertiesDialog::~PropertiesDialog () @@ -259,12 +261,18 @@ PropertiesDialog::apply_to_all_pressed () m_signals_enabled = false; if (mp_ui->apply_to_all_cbx->isChecked ()) { mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index)); - } else { - mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, m_object_index)); + } else if (! m_object_indexes.empty ()) { + mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, m_object_indexes.front ())); } m_signals_enabled = true; } +void +PropertiesDialog::selection_changed () +{ + current_index_changed (mp_ui->tree->currentIndex (), QModelIndex ()); +} + void PropertiesDialog::current_index_changed (const QModelIndex &index, const QModelIndex & /*previous*/) { @@ -272,31 +280,60 @@ PropertiesDialog::current_index_changed (const QModelIndex &index, const QModelI return; } + m_object_indexes.clear (); + if (! index.isValid ()) { - return; - } - if (mp_tree_model->parent (index).isValid ()) { - - m_index = mp_tree_model->page_index (index); - mp_ui->apply_to_all_cbx->setChecked (false); - - m_object_index = mp_tree_model->object_index (index); + m_index = -1; } else { - m_index = index.row (); - mp_ui->apply_to_all_cbx->setChecked (mp_properties_pages [m_index]->can_apply_to_all ()); + if (mp_tree_model->parent (index).isValid ()) { - m_object_index = 0; + m_index = mp_tree_model->page_index (index); + + if (mp_properties_pages [m_index]->can_apply_to_all ()) { + + m_object_indexes.push_back (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); + } + } + } + + } else { + + m_object_indexes.push_back (mp_tree_model->object_index (index)); + + } + + } else { + + 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); + } + + } } - m_current_object = 0; - for (int i = 0; i < m_index; ++i) { - m_current_object += mp_properties_pages [i]->count (); + if (! m_object_indexes.empty ()) { + m_current_object = 0; + for (int i = 0; i < m_index; ++i) { + m_current_object += mp_properties_pages [i]->count (); + } + m_current_object += m_object_indexes.front (); + } else { + m_current_object = -1; } - m_current_object += m_object_index; update_title (); update_controls (); @@ -312,6 +349,8 @@ PropertiesDialog::update_controls () } m_prev_index = m_index; + mp_ui->apply_to_all_cbx->setChecked (m_object_indexes.size () > 1); + if (m_index < 0) { mp_stack->setCurrentWidget (mp_none); @@ -334,7 +373,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_index); + mp_properties_pages [m_index]->select_entry (m_object_indexes); mp_properties_pages [m_index]->update (); } @@ -345,6 +384,10 @@ PropertiesDialog::next_pressed () { BEGIN_PROTECTED + if (m_object_indexes.empty ()) { + return; + } + if (! mp_properties_pages [m_index]->readonly ()) { db::Transaction t (mp_manager, tl::to_string (QObject::tr ("Apply changes")), m_transaction_id); mp_properties_pages [m_index]->apply (); @@ -354,13 +397,14 @@ BEGIN_PROTECTED } // advance the current entry - ++m_object_index; + int object_index = m_object_indexes.front (); + ++object_index; // look for next usable editable if at end - if (m_object_index >= int (mp_properties_pages [m_index]->count ())) { + if (object_index >= int (mp_properties_pages [m_index]->count ())) { ++m_index; - m_object_index = 0; + object_index = 0; // because we checked that there are any further elements, this should not happen: if (m_index >= int (mp_properties_pages.size ())) { @@ -369,12 +413,15 @@ BEGIN_PROTECTED } + m_object_indexes.clear (); + m_object_indexes.push_back (object_index); + ++m_current_object; update_title (); update_controls (); m_signals_enabled = false; - mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, m_object_index)); + mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, object_index)); m_signals_enabled = true; END_PROTECTED @@ -385,6 +432,10 @@ PropertiesDialog::prev_pressed () { BEGIN_PROTECTED + if (m_object_indexes.empty ()) { + return; + } + if (! mp_properties_pages [m_index]->readonly ()) { db::Transaction t (mp_manager, tl::to_string (QObject::tr ("Apply changes")), m_transaction_id); mp_properties_pages [m_index]->apply (); @@ -393,7 +444,9 @@ BEGIN_PROTECTED } } - if (m_object_index == 0) { + // advance the current entry + int object_index = m_object_indexes.front (); + if (object_index == 0) { // look for last usable editable if at end --m_index; @@ -403,19 +456,22 @@ BEGIN_PROTECTED return; } - m_object_index = mp_properties_pages [m_index]->count (); + object_index = mp_properties_pages [m_index]->count (); } // decrement the current entry - --m_object_index; + --object_index; + + m_object_indexes.clear (); + m_object_indexes.push_back (object_index); --m_current_object; update_title (); update_controls (); m_signals_enabled = false; - mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, m_object_index)); + mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, object_index)); m_signals_enabled = true; END_PROTECTED @@ -434,10 +490,14 @@ PropertiesDialog::update_title () bool PropertiesDialog::any_next () const { + if (m_object_indexes.empty ()) { + return false; + } + // look for the next applicable page // @@@ Pages should not be empty int index = m_index; - if (m_object_index + 1 >= int (mp_properties_pages [index]->count ())) { + if (m_object_indexes.front () + 1 >= int (mp_properties_pages [index]->count ())) { ++index; while (index < int (mp_properties_pages.size ()) && (mp_properties_pages [index] == 0 || mp_properties_pages [index]->count () == 0)) { @@ -452,10 +512,14 @@ PropertiesDialog::any_next () const bool PropertiesDialog::any_prev () const { + if (m_object_indexes.empty ()) { + return false; + } + // look for the next applicable page // @@@ Pages should not be empty int index = m_index; - if (m_object_index == 0) { + if (m_object_indexes.front () == 0) { --index; while (index >= 0 && (mp_properties_pages [index] == 0 || mp_properties_pages [index]->count () == 0)) { diff --git a/src/layui/layui/layPropertiesDialog.h b/src/layui/layui/layPropertiesDialog.h index 6caf8ebcd..d3ba05efa 100644 --- a/src/layui/layui/layPropertiesDialog.h +++ b/src/layui/layui/layPropertiesDialog.h @@ -85,7 +85,8 @@ private: std::vector mp_properties_pages; db::Manager *mp_manager; lay::Editables *mp_editables; - int m_index, m_prev_index, m_object_index; + int m_index, m_prev_index; + std::vector m_object_indexes; QStackedLayout *mp_stack; QLabel *mp_none; lay::MainWindow *mp_mw; @@ -110,6 +111,7 @@ public slots: void ok_pressed (); void apply_to_all_pressed (); void current_index_changed (const QModelIndex &index, const QModelIndex &previous); + void selection_changed (); protected: void reject ();