Fix SIGSEGV: defer document open after dialog close
Opening documents (especially assemblies) inside the QDialog nested event loop can crash FreeCAD when the Assembly solver triggers during document restore. Move FreeCAD.openDocument() to after dialog.exec_() returns.
This commit is contained in:
@@ -988,17 +988,14 @@ class Silo_Open:
|
|||||||
results_table.setItem(row, 4, QtGui.QTableWidgetItem(data["modified"]))
|
results_table.setItem(row, 4, QtGui.QTableWidgetItem(data["modified"]))
|
||||||
results_table.resizeColumnsToContents()
|
results_table.resizeColumnsToContents()
|
||||||
|
|
||||||
|
_open_after_close = [None]
|
||||||
|
|
||||||
def open_selected():
|
def open_selected():
|
||||||
selected = results_table.selectedItems()
|
selected = results_table.selectedItems()
|
||||||
if not selected:
|
if not selected:
|
||||||
return
|
return
|
||||||
row = selected[0].row()
|
row = selected[0].row()
|
||||||
data = results_data[row]
|
_open_after_close[0] = dict(results_data[row])
|
||||||
|
|
||||||
if data["path"]:
|
|
||||||
FreeCAD.openDocument(data["path"])
|
|
||||||
else:
|
|
||||||
_sync.open_item(data["part_number"])
|
|
||||||
dialog.accept()
|
dialog.accept()
|
||||||
|
|
||||||
search_input.textChanged.connect(lambda: do_search())
|
search_input.textChanged.connect(lambda: do_search())
|
||||||
@@ -1018,6 +1015,16 @@ class Silo_Open:
|
|||||||
do_search()
|
do_search()
|
||||||
dialog.exec_()
|
dialog.exec_()
|
||||||
|
|
||||||
|
# Open the document AFTER the dialog has fully closed so that
|
||||||
|
# heavy document loads (especially Assembly files) don't run
|
||||||
|
# inside the dialog's nested event loop, which can cause crashes.
|
||||||
|
data = _open_after_close[0]
|
||||||
|
if data is not None:
|
||||||
|
if data.get("path"):
|
||||||
|
FreeCAD.openDocument(data["path"])
|
||||||
|
else:
|
||||||
|
_sync.open_item(data["part_number"])
|
||||||
|
|
||||||
def IsActive(self):
|
def IsActive(self):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user