gui: make new tree model clickable

This commit is contained in:
Sergiusz Bazanski 2018-08-01 00:46:22 +01:00
parent 6241052e11
commit c8cf0bbc05
2 changed files with 27 additions and 27 deletions

View File

@ -24,7 +24,7 @@ NEXTPNR_NAMESPACE_BEGIN
ContextTreeModel::ContextTreeModel(QObject *parent) :
QAbstractItemModel(parent),
root_(new StaticTreeItem("Elements", nullptr)) {}
root_(new StaticTreeItem("Elements", nullptr, ElementType::NONE)) {}
ContextTreeModel::~ContextTreeModel() {}
@ -47,7 +47,7 @@ void ContextTreeModel::loadContext(Context *ctx)
belMap[std::pair<int, int>(loc.x, loc.y)].push_back(bel);
}
auto belGetter = [](Context *ctx, BelId id) { return ctx->getBelName(id); };
bel_root_ = std::unique_ptr<BelXYRoot>(new BelXYRoot(ctx, "Bels", root_.get(), belMap, belGetter));
bel_root_ = std::unique_ptr<BelXYRoot>(new BelXYRoot(ctx, "Bels", root_.get(), belMap, belGetter, ElementType::BEL));
std::map<std::pair<int, int>, std::vector<WireId>> wireMap;
for (int i = 0; i < ctx->chip_info->num_wires; i++) {
@ -57,7 +57,7 @@ void ContextTreeModel::loadContext(Context *ctx)
wireMap[std::pair<int, int>(wire->x, wire->y)].push_back(wireid);
}
auto wireGetter = [](Context *ctx, WireId id) { return ctx->getWireName(id); };
wire_root_ = std::unique_ptr<WireXYRoot>(new WireXYRoot(ctx, "Wires", root_.get(), wireMap, wireGetter));
wire_root_ = std::unique_ptr<WireXYRoot>(new WireXYRoot(ctx, "Wires", root_.get(), wireMap, wireGetter, ElementType::WIRE));
std::map<std::pair<int, int>, std::vector<PipId>> pipMap;
for (int i = 0; i < ctx->chip_info->num_pips; i++) {
@ -68,12 +68,12 @@ void ContextTreeModel::loadContext(Context *ctx)
}
printf("generating pip static tree...\n");
auto pipGetter = [](Context *ctx, PipId id) { return ctx->getPipName(id); };
pip_root_ = std::unique_ptr<PipXYRoot>(new PipXYRoot(ctx, "Pips", root_.get(), pipMap, pipGetter));
pip_root_ = std::unique_ptr<PipXYRoot>(new PipXYRoot(ctx, "Pips", root_.get(), pipMap, pipGetter, ElementType::PIP));
}
#endif
cell_root_ = std::unique_ptr<IdStringList>(new IdStringList(QString("Cells"), root_.get()));
net_root_ = std::unique_ptr<IdStringList>(new IdStringList(QString("Nets"), root_.get()));
cell_root_ = std::unique_ptr<IdStringList>(new IdStringList(QString("Cells"), root_.get(), ElementType::CELL));
net_root_ = std::unique_ptr<IdStringList>(new IdStringList(QString("Nets"), root_.get(), ElementType::NET));
endResetModel();

View File

@ -43,6 +43,7 @@ class LazyTreeItem
QString name_;
LazyTreeItem *parent_;
QList<LazyTreeItem *> children_;
ElementType type_;
void addChild(LazyTreeItem *child)
{
@ -50,8 +51,8 @@ class LazyTreeItem
}
public:
LazyTreeItem(QString name, LazyTreeItem *parent) :
name_(name), parent_(parent)
LazyTreeItem(QString name, LazyTreeItem *parent, ElementType type) :
name_(name), parent_(parent), type_(type)
{
// Register in parent if exists.
if (parent_ != nullptr) {
@ -84,9 +85,13 @@ class LazyTreeItem
return parent_;
}
ElementType type() const
{
return type_;
}
virtual bool canFetchMore() const = 0;
virtual void fetchMore() = 0;
virtual ElementType type() const = 0;
virtual IdString id() const = 0;
virtual ~LazyTreeItem() {}
@ -108,11 +113,6 @@ class StaticTreeItem : public LazyTreeItem
virtual ~StaticTreeItem() {}
virtual ElementType type() const override
{
return ElementType::NONE;
}
virtual IdString id() const override
{
return IdString();
@ -132,6 +132,7 @@ class ElementList : public LazyTreeItem
int x_, y_;
ElementGetter getter_;
std::vector<std::unique_ptr<StaticTreeItem>> managed_;
ElementType child_type_;
// scope valid until map gets mutated...
const std::vector<ElementT> *elements() const
@ -140,8 +141,8 @@ class ElementList : public LazyTreeItem
}
public:
ElementList(Context *ctx, QString name, LazyTreeItem *parent, ElementMap *map, int x, int y, ElementGetter getter) :
LazyTreeItem(name, parent), ctx_(ctx), map_(map), x_(x), y_(y), getter_(getter)
ElementList(Context *ctx, QString name, LazyTreeItem *parent, ElementMap *map, int x, int y, ElementGetter getter, ElementType type) :
LazyTreeItem(name, parent, ElementType::NONE), ctx_(ctx), map_(map), x_(x), y_(y), getter_(getter), child_type_(type)
{
}
@ -162,7 +163,7 @@ class ElementList : public LazyTreeItem
if (name.startsWith(prefix))
name.remove(0, prefix.size());
auto item = new StaticTreeItem(name, this);
auto item = new StaticTreeItem(name, this, child_type_);
managed_.push_back(std::move(std::unique_ptr<StaticTreeItem>(item)));
}
}
@ -172,11 +173,6 @@ class ElementList : public LazyTreeItem
fetchMore(100);
}
virtual ElementType type() const override
{
return ElementType::NONE;
}
virtual IdString id() const override
{
return IdString();
@ -187,7 +183,10 @@ class IdStringList : public StaticTreeItem
{
private:
std::unordered_map<IdString, std::unique_ptr<StaticTreeItem>> managed_;
ElementType child_type_;
public:
IdStringList(QString name, LazyTreeItem *parent, ElementType type) :
StaticTreeItem(name, parent, ElementType::NONE), child_type_(type) {}
using StaticTreeItem::StaticTreeItem;
void updateElements(Context *ctx, std::vector<IdString> elements)
@ -198,7 +197,7 @@ class IdStringList : public StaticTreeItem
element_set.insert(elem);
auto existing = managed_.find(elem);
if (existing == managed_.end()) {
auto item = new StaticTreeItem(elem.c_str(ctx), this);
auto item = new StaticTreeItem(elem.c_str(ctx), this, child_type_);
managed_.emplace(elem, std::unique_ptr<StaticTreeItem>(item));
}
}
@ -264,10 +263,11 @@ class ElementXYRoot : public StaticTreeItem
std::vector<std::unique_ptr<LazyTreeItem>> managed_;
ElementMap map_;
ElementGetter getter_;
ElementType child_type_;
public:
ElementXYRoot(Context *ctx, QString name, LazyTreeItem *parent, ElementMap map, ElementGetter getter) :
StaticTreeItem(name, parent), ctx_(ctx), map_(map), getter_(getter)
ElementXYRoot(Context *ctx, QString name, LazyTreeItem *parent, ElementMap map, ElementGetter getter, ElementType type) :
StaticTreeItem(name, parent, ElementType::NONE), ctx_(ctx), map_(map), getter_(getter), child_type_(type)
{
std::vector<int> y_present;
@ -284,10 +284,10 @@ class ElementXYRoot : public StaticTreeItem
continue;
// create X item for tree
auto item = new StaticTreeItem(QString("X%1").arg(i), this);
auto item = new StaticTreeItem(QString("X%1").arg(i), this, child_type_);
managed_.push_back(std::move(std::unique_ptr<LazyTreeItem>(item)));
for (auto j : y_present) {
auto item2 = new ElementList<ElementT>(ctx_, QString("Y%1").arg(j), item, &map_, i, j, getter_);
auto item2 = new ElementList<ElementT>(ctx_, QString("Y%1").arg(j), item, &map_, i, j, getter_, child_type_);
item2->fetchMore(1);
managed_.push_back(std::move(std::unique_ptr<LazyTreeItem>(item2)));
}