[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdenlive/frameworks] src/bin: Fix sorting in bin (show folders first)
From:       Jean-Baptiste Mardelle <jb () kdenlive ! org>
Date:       2014-12-31 22:39:18
Message-ID: E1Y6RvC-0007sE-Ex () scm ! kde ! org
[Download RAW message or body]

Git commit a886ccef7a5be4deaab7bc4effc3ecf1163bd4fc by Jean-Baptiste Mardelle.
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 QDomElement& \
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(AbstractProjectItem* \
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 = QVariant(m_duration);
             break;
+        case ItemTypeRole:
+            data = QVariant(m_itemType);
+            break;
 	case JobType:
 	    data = 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 = 4,
         DataDuration,
 	JobType = 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 = 4, 
 	JobType = 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 = producer->get_length_time(mlt_time_smpte_df);
 
     getFileHash();
+    setParent(parent);
 }
 
 ProjectClip::ProjectClip(const QDomElement& description, ProjectFolder* parent) :
@@ -61,6 +62,7 @@ ProjectClip::ProjectClip(const QDomElement& description, \
ProjectFolder* parent)  m_name = m_url.fileName();
     if (description.hasAttribute("zone"))
 	m_zone = 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 QString \
&name, ProjectFold  //loadChildren(description);
     m_name = name;
     m_thumbnail = 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 == Qt::DisplayRole) {
         AbstractProjectItem *item = static_cast<AbstractProjectItem \
                *>(index.internalPointer());
         return item->data(static_cast<AbstractProjectItem::DataType>(index.column()));
 @@ -78,7 +77,7 @@ QVariant ProjectItemModel::data(const QModelIndex& index, int \
                role) const
         AbstractProjectItem *item = static_cast<AbstractProjectItem \
*>(index.internalPointer());  return item->data(AbstractProjectItem::DataDuration);
     }
-    if (role == Bin::JobType || role == Bin::JobProgress || role == Bin::JobMessage) \
{ +    if (role == Bin::JobType | Bin::JobProgress | Bin::JobMessage | \
                Bin::ItemTypeRole) {
         AbstractProjectItem *item = static_cast<AbstractProjectItem \
*>(index.internalPointer());  return item->data((AbstractProjectItem::DataType) \
role);  }
diff --git a/src/bin/projectsortproxymodel.cpp b/src/bin/projectsortproxymodel.cpp
index cd9f0ba..f12ef0c 100644
--- a/src/bin/projectsortproxymodel.cpp
+++ b/src/bin/projectsortproxymodel.cpp
@@ -29,6 +29,7 @@ ProjectSortProxyModel::ProjectSortProxyModel(QObject *parent)
 {
     m_selection = new QItemSelectionModel(this);
     connect(m_selection, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), \
this, SLOT(onCurrentRowChanged(QItemSelection,QItemSelection))); +    \
setDynamicSortFilter(true);  }
 
 bool ProjectSortProxyModel::filterAcceptsRow(int sourceRow,
@@ -38,6 +39,18 @@ bool ProjectSortProxyModel::filterAcceptsRow(int sourceRow,
     return (sourceModel()->data(index0).toString().contains(m_searchString));
 }
 
+bool ProjectSortProxyModel::lessThan(const QModelIndex & left, const QModelIndex & \
right) const +{
+    // Check item type (folder or clip) as defined in projectitemmodel
+    int leftType = sourceModel()->data(left, 4).toInt();
+    int rightType = sourceModel()->data(right, 4).toInt();
+    if (leftType == 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/projectsortproxymodel.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 search string \
                */
     bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
+    /** @brief Reimplemented to show folders first  */
+    bool lessThan(const QModelIndex & left, const QModelIndex & right) const;
 
 private:
     QItemSelectionModel*m_selection;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic