bool RepoFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { RepoTreeModel *tree_model = (RepoTreeModel *)(sourceModel()); QStandardItem *item_l = tree_model->itemFromIndex(left); QStandardItem *item_r = tree_model->itemFromIndex(right); /** * When we have filter: sort category by matched repos count * When we have no filter: sort category by category index order * */ if (item_l->type() == REPO_CATEGORY_TYPE) { // repo categories RepoCategoryItem *cl = (RepoCategoryItem *)item_l; RepoCategoryItem *cr = (RepoCategoryItem *)item_r; if (has_filter_) { // printf ("%s matched: %d, %s matched: %d\n", // cl->name().toUtf8().data(), cl->matchedReposCount(), // cr->name().toUtf8().data(), cr->matchedReposCount()); return cl->matchedReposCount() > cr->matchedReposCount(); } else { int cat_l = cl->categoryIndex(); int cat_r = cr->categoryIndex(); if (cat_l == cat_r) { return cl->name() < cr->name(); } else { return cat_l < cat_r; } } } else { // repos RepoItem *cl = (RepoItem *)item_l; RepoItem *cr = (RepoItem *)item_r; return cl->repo().mtime > cr->repo().mtime; } return false; }
int RepoCategoryItem::matchedReposCount() const { if (isGroupsRoot()) { // This item is the groups root level. int i, n = rowCount(), sum = 0; for (i = 0; i < n; i++) { RepoCategoryItem *group = (RepoCategoryItem *)child(i); sum += group->matchedReposCount(); } return sum; } // A normal group item. return matched_repos_ >= 0 ? matched_repos_ : rowCount(); }