From kde-commits Wed Dec 31 22:39:18 2014 From: Jean-Baptiste Mardelle Date: Wed, 31 Dec 2014 22:39:18 +0000 To: kde-commits Subject: [kdenlive/frameworks] src/bin: Fix sorting in bin (show folders first) Message-Id: X-MARC-Message: https://marc.info/?l=kde-commits&m=142006556708430 Git commit a886ccef7a5be4deaab7bc4effc3ecf1163bd4fc by Jean-Baptiste Mardel= le. Committed on 31/12/2014 at 22:39. Pushed by mardelle into branch 'frameworks'. Fix sorting in bin (show folders first) M +5 -4 src/bin/abstractprojectitem.cpp M +2 -1 src/bin/abstractprojectitem.h M +1 -0 src/bin/bin.h M +2 -0 src/bin/projectclip.cpp M +2 -0 src/bin/projectfolder.cpp M +1 -2 src/bin/projectitemmodel.cpp M +13 -0 src/bin/projectsortproxymodel.cpp M +2 -0 src/bin/projectsortproxymodel.h http://commits.kde.org/kdenlive/a886ccef7a5be4deaab7bc4effc3ecf1163bd4fc diff --git a/src/bin/abstractprojectitem.cpp b/src/bin/abstractprojectitem.= cpp index eae3be5..38c60b1 100644 --- a/src/bin/abstractprojectitem.cpp +++ b/src/bin/abstractprojectitem.cpp @@ -38,7 +38,6 @@ AbstractProjectItem::AbstractProjectItem(PROJECTITEMTYPE = type, const QString &id , m_jobType(AbstractClipJob::NOJOBTYPE) , m_itemType(type) { - setParent(parent); } = AbstractProjectItem::AbstractProjectItem(PROJECTITEMTYPE type, const QDomE= lement& description, AbstractProjectItem* parent) : @@ -50,7 +49,6 @@ AbstractProjectItem::AbstractProjectItem(PROJECTITEMTYPE = type, const QDomElement , m_jobType(AbstractClipJob::NOJOBTYPE) , m_itemType(type) { - setParent(parent); } = AbstractProjectItem::~AbstractProjectItem() @@ -131,9 +129,9 @@ void AbstractProjectItem::finishInsert(AbstractProjectI= tem* parent) void AbstractProjectItem::addChild(AbstractProjectItem* child) { if (child && !contains(child)) { - if (bin()) bin()->emitAboutToAddItem(child); + bin()->emitAboutToAddItem(child); append(child); - if (bin()) bin()->emitItemAdded(this); + bin()->emitItemAdded(child); } } = @@ -176,6 +174,9 @@ QVariant AbstractProjectItem::data(DataType type) const case DataDuration: data =3D QVariant(m_duration); break; + case ItemTypeRole: + data =3D QVariant(m_itemType); + break; case JobType: data =3D QVariant(m_jobType); break; diff --git a/src/bin/abstractprojectitem.h b/src/bin/abstractprojectitem.h index 81c7802..a5caac5 100644 --- a/src/bin/abstractprojectitem.h +++ b/src/bin/abstractprojectitem.h @@ -121,10 +121,11 @@ public: DataDescription, DataDate, DataThumbnail, + ItemTypeRole =3D 4, DataDuration, JobType =3D Qt::UserRole + 1, JobProgress, - JobMessage + JobMessage, }; = /** @brief Returns the data that describes this item. diff --git a/src/bin/bin.h b/src/bin/bin.h index 9317e9e..21f8104 100644 --- a/src/bin/bin.h +++ b/src/bin/bin.h @@ -279,6 +279,7 @@ public: = /** @brief Defines the values for data roles */ enum DATATYPE { + ItemTypeRole =3D 4, = JobType =3D Qt::UserRole + 1, JobProgress, JobMessage diff --git a/src/bin/projectclip.cpp b/src/bin/projectclip.cpp index 348a090..55f763c 100644 --- a/src/bin/projectclip.cpp +++ b/src/bin/projectclip.cpp @@ -49,6 +49,7 @@ ProjectClip::ProjectClip(const QString &id, Mlt::Producer= *producer, ProjectFold m_duration =3D producer->get_length_time(mlt_time_smpte_df); = getFileHash(); + setParent(parent); } = ProjectClip::ProjectClip(const QDomElement& description, ProjectFolder* pa= rent) : @@ -61,6 +62,7 @@ ProjectClip::ProjectClip(const QDomElement& description, = ProjectFolder* parent) m_name =3D m_url.fileName(); if (description.hasAttribute("zone")) m_zone =3D QPoint(description.attribute("zone").section(':', 0, 0).toInt(= ), description.attribute("zone").section(':', 1, 1).toInt()); + setParent(parent); } = = diff --git a/src/bin/projectfolder.cpp b/src/bin/projectfolder.cpp index 81715e5..a4cfafe 100644 --- a/src/bin/projectfolder.cpp +++ b/src/bin/projectfolder.cpp @@ -34,12 +34,14 @@ ProjectFolder::ProjectFolder(const QString &id, const Q= String &name, ProjectFold //loadChildren(description); m_name =3D name; m_thumbnail =3D QIcon::fromTheme("folder").pixmap(40, 40); + setParent(parent); } = ProjectFolder::ProjectFolder(Bin *bin) : AbstractProjectItem(AbstractProjectItem::FolderItem, QString::number(-= 1)) , m_bin(bin) { + setParent(NULL); } = ProjectFolder::~ProjectFolder() diff --git a/src/bin/projectitemmodel.cpp b/src/bin/projectitemmodel.cpp index 215a0b0..cb3f155 100644 --- a/src/bin/projectitemmodel.cpp +++ b/src/bin/projectitemmodel.cpp @@ -58,7 +58,6 @@ QVariant ProjectItemModel::data(const QModelIndex& index,= int role) const if (!index.isValid()) { return QVariant(); } - if (role =3D=3D Qt::DisplayRole) { AbstractProjectItem *item =3D static_cast(i= ndex.internalPointer()); return item->data(static_cast(index= .column())); @@ -78,7 +77,7 @@ QVariant ProjectItemModel::data(const QModelIndex& index,= int role) const AbstractProjectItem *item =3D static_cast(i= ndex.internalPointer()); return item->data(AbstractProjectItem::DataDuration); } - if (role =3D=3D Bin::JobType || role =3D=3D Bin::JobProgress || role = =3D=3D Bin::JobMessage) { + if (role =3D=3D Bin::JobType | Bin::JobProgress | Bin::JobMessage | Bi= n::ItemTypeRole) { AbstractProjectItem *item =3D static_cast(i= ndex.internalPointer()); return item->data((AbstractProjectItem::DataType) role); } diff --git a/src/bin/projectsortproxymodel.cpp b/src/bin/projectsortproxymo= del.cpp index cd9f0ba..f12ef0c 100644 --- a/src/bin/projectsortproxymodel.cpp +++ b/src/bin/projectsortproxymodel.cpp @@ -29,6 +29,7 @@ ProjectSortProxyModel::ProjectSortProxyModel(QObject *par= ent) { m_selection =3D new QItemSelectionModel(this); connect(m_selection, SIGNAL(selectionChanged(QItemSelection,QItemSelec= tion)), this, SLOT(onCurrentRowChanged(QItemSelection,QItemSelection))); + setDynamicSortFilter(true); } = bool ProjectSortProxyModel::filterAcceptsRow(int sourceRow, @@ -38,6 +39,18 @@ bool ProjectSortProxyModel::filterAcceptsRow(int sourceR= ow, return (sourceModel()->data(index0).toString().contains(m_searchString= )); } = +bool ProjectSortProxyModel::lessThan(const QModelIndex & left, const QMode= lIndex & right) const +{ + // Check item type (folder or clip) as defined in projectitemmodel + int leftType =3D sourceModel()->data(left, 4).toInt(); + int rightType =3D sourceModel()->data(right, 4).toInt(); + if (leftType =3D=3D rightType) { + // Let the normal alphabetical sort happen + return QSortFilterProxyModel::lessThan(right, left); + } + return leftType > rightType; +} + QItemSelectionModel* ProjectSortProxyModel::selectionModel() { return m_selection; diff --git a/src/bin/projectsortproxymodel.h b/src/bin/projectsortproxymode= l.h index 49c5a43..02249c7 100644 --- a/src/bin/projectsortproxymodel.h +++ b/src/bin/projectsortproxymodel.h @@ -53,6 +53,8 @@ private slots: protected: /** @brief Decide which items should be displayed depending on the sea= rch string */ bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) = const; + /** @brief Reimplemented to show folders first */ + bool lessThan(const QModelIndex & left, const QModelIndex & right) con= st; = private: QItemSelectionModel*m_selection;