ProjectExplorer: Order projects in session alphabetically again

Task-number: QTCREATORBUG-18337
Change-Id: I716369a1012f93c6c676e89c3b32cd1a406996a5
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2017-08-16 16:44:22 +02:00
parent b0bba662f8
commit 06569e5f3a
3 changed files with 30 additions and 11 deletions

View File

@@ -689,6 +689,13 @@ void TreeItem::insertChild(int pos, TreeItem *item)
} }
} }
void TreeItem::insertOrderedChild(TreeItem *item,
const std::function<bool (const TreeItem *, const TreeItem *)> &cmp)
{
auto where = std::lower_bound(begin(), end(), item, cmp);
insertChild(int(where - begin()), item);
}
void TreeItem::removeChildAt(int pos) void TreeItem::removeChildAt(int pos)
{ {
QTC_ASSERT(0 <= pos && pos < m_children.count(), return); QTC_ASSERT(0 <= pos && pos < m_children.count(), return);

View File

@@ -54,6 +54,9 @@ public:
void prependChild(TreeItem *item); void prependChild(TreeItem *item);
void appendChild(TreeItem *item); void appendChild(TreeItem *item);
void insertChild(int pos, TreeItem *item); void insertChild(int pos, TreeItem *item);
void insertOrderedChild(TreeItem *item,
const std::function<bool(const TreeItem *, const TreeItem *)> &cmp);
void removeChildAt(int pos); void removeChildAt(int pos);
void removeChildren(); void removeChildren();
void sortChildren(const std::function<bool(const TreeItem *, const TreeItem *)> &cmp); void sortChildren(const std::function<bool(const TreeItem *, const TreeItem *)> &cmp);
@@ -135,6 +138,14 @@ public:
ParentType *parent() const { ParentType *parent() const {
return static_cast<ParentType *>(TreeItem::parent()); return static_cast<ParentType *>(TreeItem::parent());
} }
void insertOrderedChild(ChildType *item, const std::function<bool(const ChildType *, const ChildType *)> &cmp)
{
const auto cmp0 = [cmp](const TreeItem *lhs, const TreeItem *rhs) {
return cmp(static_cast<const ChildType *>(lhs), static_cast<const ChildType *>(rhs));
};
TreeItem::insertOrderedChild(item, cmp0);
}
}; };
class QTCREATOR_UTILS_EXPORT StaticTreeItem : public TreeItem class QTCREATOR_UTILS_EXPORT StaticTreeItem : public TreeItem

View File

@@ -175,6 +175,16 @@ bool FlatModel::setData(const QModelIndex &index, const QVariant &value, int rol
return true; return true;
} }
static bool compareProjectNames(const WrapperNode *lhs, const WrapperNode *rhs)
{
Node *p1 = lhs->m_node;
Node *p2 = rhs->m_node;
const int displayNameResult = caseFriendlyCompare(p1->displayName(), p2->displayName());
if (displayNameResult != 0)
return displayNameResult < 0;
return p1 < p2; // sort by pointer value
}
void FlatModel::addOrRebuildProjectModel(Project *project) void FlatModel::addOrRebuildProjectModel(Project *project)
{ {
WrapperNode *container = nodeForProject(project); WrapperNode *container = nodeForProject(project);
@@ -182,7 +192,7 @@ void FlatModel::addOrRebuildProjectModel(Project *project)
container->removeChildren(); container->removeChildren();
} else { } else {
container = new WrapperNode(project->containerNode()); container = new WrapperNode(project->containerNode());
rootItem()->appendChild(container); rootItem()->insertOrderedChild(container, &compareProjectNames);
} }
QSet<Node *> seen; QSet<Node *> seen;
@@ -230,16 +240,7 @@ void FlatModel::updateSubtree(FolderNode *node)
void FlatModel::rebuildModel() void FlatModel::rebuildModel()
{ {
QList<Project *> projects = SessionManager::projects(); const QList<Project *> projects = SessionManager::projects();
QTC_CHECK(projects.size() == rootItem()->childCount());
Utils::sort(projects, [](Project *p1, Project *p2) {
const int displayNameResult = caseFriendlyCompare(p1->displayName(), p2->displayName());
if (displayNameResult != 0)
return displayNameResult < 0;
return p1 < p2; // sort by pointer value
});
for (Project *project : projects) for (Project *project : projects)
addOrRebuildProjectModel(project); addOrRebuildProjectModel(project);
} }