From fe05c2287b0a387f174e9ddaec63883de4f30782 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 5 Feb 2019 21:37:01 +0100 Subject: [PATCH] Ref T472, fixed expandAll/fullResizeToContents heap issue * after updating the container update "expandAll" was called * in onExpanded multiple "fullResizeToContents" occured, resulting in the healp issue below * as it was a good idea anyway to reduce the slow "fullResizeToContents" anyway, so we are using a CDigestSignal * this also solved the HEAP issue (for some reason I have NOT investigated) HEAP[swiftdata.exe]: HEAP: Free Heap block 000001AB439BFFF0 modified at 000001AB439C00BC after it was freed --- .../models/aircraftcategorytreemodel.cpp | 25 ++++++------------- .../views/aircraftcategorytreeview.cpp | 12 ++++++--- src/blackgui/views/aircraftcategorytreeview.h | 12 ++++++--- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/blackgui/models/aircraftcategorytreemodel.cpp b/src/blackgui/models/aircraftcategorytreemodel.cpp index 45cc01f28..e459748cc 100644 --- a/src/blackgui/models/aircraftcategorytreemodel.cpp +++ b/src/blackgui/models/aircraftcategorytreemodel.cpp @@ -40,15 +40,11 @@ namespace BlackGui void CAircraftCategoryTreeModel::updateContainer(const CAircraftCategoryList &categories) { - if (categories.isEmpty()) - { - CAircraftCategoryTreeModel::clear(); - return; - } + this->clear(); + if (categories.isEmpty()) { return; } m_categories = categories; m_categories.sortByLevel(); - QStandardItemModel::clear(); QMap items; this->setColumnCount(m_columns.size() + 1); @@ -69,18 +65,8 @@ namespace BlackGui { const CPropertyIndex i(column.getPropertyIndex()); const CVariant v(category.propertyByIndex(i)); - - if (column.getFormatter()->supportsRole(Qt::DecorationRole)) - { - const QIcon icon = column.getFormatter()->decorationRole(v).toPixmap(); - si = new QStandardItem(icon, QString()); - } - else if (column.getFormatter()->supportsRole(Qt::DisplayRole)) - { - const CVariant f = column.getFormatter()->displayRole(v); - si = new QStandardItem(f.toQString(true)); - } - if (!si) { continue; } + const CVariant f = column.getFormatter()->displayRole(v); + si = new QStandardItem(f.toQString(true)); si->setEditable(false); // make not editable categoryRow.push_back(si); } // columns @@ -94,8 +80,11 @@ namespace BlackGui else { const int p = category.getDepth() - 1; + Q_ASSERT_X(items[p], Q_FUNC_INFO, "No parent item"); items[p]->appendRow(categoryRow); } + + Q_ASSERT_X(!categoryRow.isEmpty(), Q_FUNC_INFO, "Category row is empty"); items.insert(category.getDepth(), categoryRow.front()); } } diff --git a/src/blackgui/views/aircraftcategorytreeview.cpp b/src/blackgui/views/aircraftcategorytreeview.cpp index a965720ee..c1f8e5a28 100644 --- a/src/blackgui/views/aircraftcategorytreeview.cpp +++ b/src/blackgui/views/aircraftcategorytreeview.cpp @@ -48,15 +48,21 @@ namespace BlackGui this->categoryModel()->clear(); } + void CAircraftCategoryTreeView::fullResizeToContents() + { + m_dsFullResize.inputSignal(); + } + void CAircraftCategoryTreeView::setColumns(const CColumns &columns) { if (this->categoryModel()) { this->categoryModel()->setColumns(columns); } } - void CAircraftCategoryTreeView::fullResizeToContents() + void CAircraftCategoryTreeView::fullResizeToContentsImpl() { if (this->isEmpty()) { return; } - for (int c = 0; c < this->categoryModel()->columnCount(); c++) + const int cc = this->categoryModel()->columnCount(); + for (int c = 0; c < cc; c++) { this->resizeColumnToContents(c); } @@ -105,7 +111,7 @@ namespace BlackGui QMenu *menu = new QMenu(this); // menu QAction *resize = new QAction(CIcons::resize16(), "Resize", this); - connect(resize, &QAction::triggered, this, &CAircraftCategoryTreeView::fullResizeToContents); + connect(resize, &QAction::triggered, this, &CAircraftCategoryTreeView::fullResizeToContentsImpl); menu->addAction(resize); menu->popup(this->viewport()->mapToGlobal(point)); diff --git a/src/blackgui/views/aircraftcategorytreeview.h b/src/blackgui/views/aircraftcategorytreeview.h index 98d824bfd..10af2265f 100644 --- a/src/blackgui/views/aircraftcategorytreeview.h +++ b/src/blackgui/views/aircraftcategorytreeview.h @@ -14,6 +14,7 @@ #include "blackgui/blackguiexport.h" #include "blackmisc/aviation/aircraftcategorylist.h" +#include "blackmisc/digestsignal.h" #include #include @@ -46,12 +47,12 @@ namespace BlackGui //! Clear void clear(); - //! Set columns - void setColumns(const Models::CColumns &columns); - //! Resize all columns void fullResizeToContents(); + //! Set columns + void setColumns(const Models::CColumns &columns); + //! Empty data bool isEmpty() const; @@ -62,6 +63,9 @@ namespace BlackGui //! Used model BlackGui::Models::CAircraftCategoryTreeModel *categoryModel(); + //! Resize all columns + void fullResizeToContentsImpl(); + //! The selected object BlackMisc::Aviation::CAircraftCategory selectedObject() const; @@ -73,6 +77,8 @@ namespace BlackGui //! Custom menu void customMenu(const QPoint &point); + + BlackMisc::CDigestSignal m_dsFullResize { this, &CAircraftCategoryTreeView::fullResizeToContentsImpl, 1000, 25 }; }; } // ns } // ns