On macos and with the LyX2.4 master:

In the BibTeX Bibliography dialog: when handling items in the selected databases list (moving items up/down or adding items) LyX crashes with an EXC_BAD_ACCESS.
(LyX2.3.1 does not show this problem.)

Possible solution:

In GuiSelectionManager.cpp the routines addPB_clicked(), upPB_clicked() and downPB_clicked() define a QModelIndex idx, then make changes to the model and use idx again. According to the qt5 documentation a QPersistentModelIndex should be used:

Note: Model indexes should be used immediately and then discarded. You should not rely on indexes to remain valid after calling model functions that change the structure of the model or delete items. If you need to keep a model index over time use a QPersistentModelIndex.
        
In addPB_clicked() the idx is only used in one place and it’s definition can be moved. In upPB_clicked() and downPB_clicked() I first made idx of type QPersistentModelIndex and this avoids the crashes but the selection is lost when moving an item up/down.

I then redefined idx before the 2nd use and removed the selectionChanged() signals and this avoids the crashes and keeps the selection intact (patch included).

P. De Visschere
diff --git a/src/frontends/qt/GuiSelectionManager.cpp 
b/src/frontends/qt/GuiSelectionManager.cpp
index 4a735ed2d6..d77acbadc6 100644
--- a/src/frontends/qt/GuiSelectionManager.cpp
+++ b/src/frontends/qt/GuiSelectionManager.cpp
@@ -285,14 +285,14 @@ void GuiSelectionManager::addPB_clicked()
                return;
 
        QModelIndex const idxToAdd = selIdx.first();
-       QModelIndex const idx = selectedLV->currentIndex();
        int const srows = selectedModel->rowCount();
 
        QMap<int, QVariant> qm = availableModel->itemData(idxToAdd);
        insertRowToSelected(srows, qm);
 
        selectionChanged(); //signal
-
+       
+       QModelIndex const idx = selectedLV->currentIndex();
        if (idx.isValid())
                selectedLV->setCurrentIndex(idx);
 
@@ -344,8 +344,7 @@ void GuiSelectionManager::upPB_clicked()
        selectedModel->removeRow(pos);
        insertRowToSelected(pos - 1, qms);
 
-       selectionChanged(); //signal
-
+       idx = selIdx.first();
        selectedLV->setCurrentIndex(idx.sibling(idx.row() - 1, idx.column()));
        selectedHasFocus_ = true;
        updateHook();
@@ -372,8 +371,7 @@ void GuiSelectionManager::downPB_clicked()
        selectedModel->removeRow(pos);
        insertRowToSelected(pos + 1, qms);
 
-       selectionChanged(); //signal
-
+       idx = selIdx.first();
        selectedLV->setCurrentIndex(idx.sibling(idx.row() + 1, idx.column()));
        selectedHasFocus_ = true;
        updateHook();
-- 
lyx-devel mailing list
lyx-devel@lists.lyx.org
http://lists.lyx.org/mailman/listinfo/lyx-devel

Reply via email to