diff --git a/src/app/layout/qgslayoutitemslistview.cpp b/src/app/layout/qgslayoutitemslistview.cpp index 1ec386fff2a4..3fdaff50f5d6 100644 --- a/src/app/layout/qgslayoutitemslistview.cpp +++ b/src/app/layout/qgslayoutitemslistview.cpp @@ -21,6 +21,54 @@ #include #include + +QgsLayoutItemsListViewModel::QgsLayoutItemsListViewModel( QgsLayoutModel *model, QObject *parent ) + : QSortFilterProxyModel( parent ) + , mModel( model ) +{ + setSourceModel( mModel ); +} + +QgsLayoutItem *QgsLayoutItemsListViewModel::itemFromIndex( const QModelIndex &index ) const +{ + return mModel->itemFromIndex( mapToSource( index ) ); +} + +void QgsLayoutItemsListViewModel::setSelected( const QModelIndex &index ) +{ + mModel->setSelected( mapToSource( index ) ); +} + +QVariant QgsLayoutItemsListViewModel::data( const QModelIndex &index, int role ) const +{ + if ( !index.isValid() ) + return QVariant(); + + QgsLayoutItem *item = itemFromIndex( index ); + if ( !item ) + { + return QVariant(); + } + + if ( role == Qt::FontRole ) + { + if ( index.column() == QgsLayoutModel::ItemId && item->isSelected() ) + { + //draw name of selected items in bold + QFont boldFont; + boldFont.setBold( true ); + return boldFont; + } + } + + return QSortFilterProxyModel::data( index, role ); +} + + +// +// QgsLayoutItemsListView +// + QgsLayoutItemsListView::QgsLayoutItemsListView( QWidget *parent, QgsLayoutDesignerDialog *designer ) : QTreeView( parent ) , mDesigner( designer ) @@ -39,7 +87,7 @@ QgsLayoutItemsListView::QgsLayoutItemsListView( QWidget *parent, QgsLayoutDesign void QgsLayoutItemsListView::setCurrentLayout( QgsLayout *layout ) { mLayout = layout; - mModel = layout->itemsModel(); + mModel = new QgsLayoutItemsListViewModel( layout->itemsModel(), this ); setModel( mModel ); header()->setSectionResizeMode( 0, QHeaderView::Fixed ); @@ -48,7 +96,7 @@ void QgsLayoutItemsListView::setCurrentLayout( QgsLayout *layout ) setColumnWidth( 1, Qgis::UI_SCALE_FACTOR * fontMetrics().width( QStringLiteral( "xxxx" ) ) ); header()->setSectionsMovable( false ); - connect( selectionModel(), &QItemSelectionModel::currentChanged, mLayout->itemsModel(), &QgsLayoutModel::setSelected ); + connect( selectionModel(), &QItemSelectionModel::currentChanged, mModel, &QgsLayoutItemsListViewModel::setSelected ); } void QgsLayoutItemsListView::showContextMenu( QPoint point ) diff --git a/src/app/layout/qgslayoutitemslistview.h b/src/app/layout/qgslayoutitemslistview.h index 7346b60a645a..9b45e2e094b7 100644 --- a/src/app/layout/qgslayoutitemslistview.h +++ b/src/app/layout/qgslayoutitemslistview.h @@ -18,10 +18,31 @@ #include "qgis.h" #include +#include class QgsLayout; class QgsLayoutDesignerDialog; class QgsLayoutModel; +class QgsLayoutItem; + +class QgsLayoutItemsListViewModel : public QSortFilterProxyModel +{ + Q_OBJECT + + public: + + QgsLayoutItemsListViewModel( QgsLayoutModel *model, QObject *parent ); + + QgsLayoutItem *itemFromIndex( const QModelIndex &index ) const; \ + QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override; + + public slots: + void setSelected( const QModelIndex &index ); + + private: + + QgsLayoutModel *mModel = nullptr; +}; /** * A list view for showing items in a layout @@ -46,7 +67,7 @@ class QgsLayoutItemsListView : public QTreeView private: QgsLayout *mLayout = nullptr; - QgsLayoutModel *mModel = nullptr; + QgsLayoutItemsListViewModel *mModel = nullptr; QgsLayoutDesignerDialog *mDesigner = nullptr; }; diff --git a/src/core/layout/qgslayoutmodel.cpp b/src/core/layout/qgslayoutmodel.cpp index 2a0ce176d363..6c2867dc743d 100644 --- a/src/core/layout/qgslayoutmodel.cpp +++ b/src/core/layout/qgslayoutmodel.cpp @@ -182,16 +182,6 @@ QVariant QgsLayoutModel::data( const QModelIndex &index, int role ) const return QVariant(); } - case Qt::FontRole: - if ( index.column() == ItemId && item->isSelected() ) - { - //draw name of selected items in bold - QFont boldFont; - boldFont.setBold( true ); - return boldFont; - } - return QVariant(); - default: return QVariant(); }