Added sorting

This commit is contained in:
Miodrag Milanovic 2018-07-29 10:56:36 +02:00
parent ba2531edc0
commit 7c8865d2fc
2 changed files with 38 additions and 14 deletions

View File

@ -21,6 +21,11 @@
NEXTPNR_NAMESPACE_BEGIN NEXTPNR_NAMESPACE_BEGIN
static bool contextTreeItemLessThan(const ContextTreeItem *v1, const ContextTreeItem *v2)
{
return v1->name() < v2->name();
}
ContextTreeItem::ContextTreeItem() { parentNode = nullptr; } ContextTreeItem::ContextTreeItem() { parentNode = nullptr; }
ContextTreeItem::ContextTreeItem(QString name) ContextTreeItem::ContextTreeItem(QString name)
@ -45,6 +50,13 @@ void ContextTreeItem::addChild(ContextTreeItem *item)
children.append(item); children.append(item);
} }
void ContextTreeItem::sort()
{
for (auto item : children)
if (item->count()>1) item->sort();
qSort(children.begin(), children.end(), contextTreeItemLessThan);
}
ContextTreeModel::ContextTreeModel(QObject *parent) : QAbstractItemModel(parent) { root = new ContextTreeItem(); } ContextTreeModel::ContextTreeModel(QObject *parent) : QAbstractItemModel(parent) { root = new ContextTreeItem(); }
ContextTreeModel::~ContextTreeModel() { delete root; } ContextTreeModel::~ContextTreeModel() { delete root; }
@ -92,6 +104,7 @@ void ContextTreeModel::loadData(Context *ctx)
parent = bel_items[name]; parent = bel_items[name];
} }
} }
bels_root->sort();
ContextTreeItem *wire_root = new ContextTreeItem("Wires"); ContextTreeItem *wire_root = new ContextTreeItem("Wires");
root->addChild(wire_root); root->addChild(wire_root);
@ -121,6 +134,7 @@ void ContextTreeModel::loadData(Context *ctx)
parent = wire_items[name]; parent = wire_items[name];
} }
} }
wire_root->sort();
ContextTreeItem *pip_root = new ContextTreeItem("Pips"); ContextTreeItem *pip_root = new ContextTreeItem("Pips");
root->addChild(pip_root); root->addChild(pip_root);
@ -150,6 +164,7 @@ void ContextTreeModel::loadData(Context *ctx)
parent = pip_items[name]; parent = pip_items[name];
} }
} }
pip_root->sort();
nets_root = new ContextTreeItem("Nets"); nets_root = new ContextTreeItem("Nets");
root->addChild(nets_root); root->addChild(nets_root);
@ -165,18 +180,20 @@ void ContextTreeModel::updateData(Context *ctx)
if (!ctx) if (!ctx)
return; return;
QModelIndex nets_index = indexFromNode(nets_root); beginResetModel();
//QModelIndex nets_index = indexFromNode(nets_root);
// Remove nets not existing any more // Remove nets not existing any more
QMap<QString, ContextTreeItem *>::iterator i = nameToItem[3].begin(); QMap<QString, ContextTreeItem *>::iterator i = nameToItem[3].begin();
while (i != nameToItem[3].end()) { while (i != nameToItem[3].end()) {
QMap<QString, ContextTreeItem *>::iterator prev = i; QMap<QString, ContextTreeItem *>::iterator prev = i;
++i; ++i;
if (ctx->nets.find(ctx->id(prev.key().toStdString())) == ctx->nets.end()) { if (ctx->nets.find(ctx->id(prev.key().toStdString())) == ctx->nets.end()) {
int pos = prev.value()->parent()->indexOf(prev.value()); //int pos = prev.value()->parent()->indexOf(prev.value());
beginRemoveRows(nets_index, pos, pos); //beginRemoveRows(nets_index, pos, pos);
delete prev.value(); delete prev.value();
nameToItem[3].erase(prev); nameToItem[3].erase(prev);
endRemoveRows(); //endRemoveRows();
} }
} }
// Add nets to tree // Add nets to tree
@ -184,26 +201,28 @@ void ContextTreeModel::updateData(Context *ctx)
auto id = item.first; auto id = item.first;
QString name = QString(id.c_str(ctx)); QString name = QString(id.c_str(ctx));
if (!nameToItem[3].contains(name)) { if (!nameToItem[3].contains(name)) {
beginInsertRows(nets_index, nets_root->count() + 1, nets_root->count() + 1); //beginInsertRows(nets_index, nets_root->count() + 1, nets_root->count() + 1);
ContextTreeItem *newItem = new ContextTreeItem(id, ElementType::NET, name); ContextTreeItem *newItem = new ContextTreeItem(id, ElementType::NET, name);
nets_root->addChild(newItem); nets_root->addChild(newItem);
nameToItem[3].insert(name, newItem); nameToItem[3].insert(name, newItem);
endInsertRows(); //endInsertRows();
} }
} }
QModelIndex cell_index = indexFromNode(cells_root); nets_root->sort();
//QModelIndex cell_index = indexFromNode(cells_root);
// Remove cells not existing any more // Remove cells not existing any more
i = nameToItem[4].begin(); i = nameToItem[4].begin();
while (i != nameToItem[4].end()) { while (i != nameToItem[4].end()) {
QMap<QString, ContextTreeItem *>::iterator prev = i; QMap<QString, ContextTreeItem *>::iterator prev = i;
++i; ++i;
if (ctx->cells.find(ctx->id(prev.key().toStdString())) == ctx->cells.end()) { if (ctx->cells.find(ctx->id(prev.key().toStdString())) == ctx->cells.end()) {
int pos = prev.value()->parent()->indexOf(prev.value()); //int pos = prev.value()->parent()->indexOf(prev.value());
beginRemoveRows(cell_index, pos, pos); //beginRemoveRows(cell_index, pos, pos);
delete prev.value(); delete prev.value();
nameToItem[4].erase(prev); nameToItem[4].erase(prev);
endRemoveRows(); //endRemoveRows();
} }
} }
// Add cells to tree // Add cells to tree
@ -211,13 +230,17 @@ void ContextTreeModel::updateData(Context *ctx)
auto id = item.first; auto id = item.first;
QString name = QString(id.c_str(ctx)); QString name = QString(id.c_str(ctx));
if (!nameToItem[4].contains(name)) { if (!nameToItem[4].contains(name)) {
beginInsertRows(cell_index, cells_root->count() + 1, cells_root->count() + 1); //beginInsertRows(cell_index, cells_root->count() + 1, cells_root->count() + 1);
ContextTreeItem *newItem = new ContextTreeItem(id, ElementType::CELL, name); ContextTreeItem *newItem = new ContextTreeItem(id, ElementType::CELL, name);
cells_root->addChild(newItem); cells_root->addChild(newItem);
nameToItem[4].insert(name, newItem); nameToItem[4].insert(name, newItem);
endInsertRows(); //endInsertRows();
} }
} }
cells_root->sort();
endResetModel();
} }
int ContextTreeModel::rowCount(const QModelIndex &parent) const { return nodeFromIndex(parent)->count(); } int ContextTreeModel::rowCount(const QModelIndex &parent) const { return nodeFromIndex(parent)->count(); }

View File

@ -52,6 +52,7 @@ class ContextTreeItem
IdString id() const { return itemId; } IdString id() const { return itemId; }
ElementType type() const { return itemType; } ElementType type() const { return itemType; }
QString name() const { return itemName; } QString name() const { return itemName; }
void sort();
private: private:
ContextTreeItem *parentNode; ContextTreeItem *parentNode;
QList<ContextTreeItem *> children; QList<ContextTreeItem *> children;