Make custom types for elements in tree view
This commit is contained in:
parent
9b3af68e44
commit
68c6239cdc
@ -9,6 +9,76 @@
|
|||||||
#include <QDate>
|
#include <QDate>
|
||||||
#include <QLocale>
|
#include <QLocale>
|
||||||
|
|
||||||
|
enum class ElementType
|
||||||
|
{
|
||||||
|
BEL,
|
||||||
|
WIRE,
|
||||||
|
PIP
|
||||||
|
};
|
||||||
|
|
||||||
|
class ElementTreeItem : public QTreeWidgetItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ElementTreeItem(ElementType t, QString str)
|
||||||
|
: QTreeWidgetItem((QTreeWidget *)nullptr, QStringList(str)), type(t)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
virtual ~ElementTreeItem(){};
|
||||||
|
|
||||||
|
ElementType getType() { return type; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
ElementType type;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BelTreeItem : public ElementTreeItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BelTreeItem(IdString d, ElementType type, QString str)
|
||||||
|
: ElementTreeItem(type, str)
|
||||||
|
{
|
||||||
|
this->data = d;
|
||||||
|
}
|
||||||
|
virtual ~BelTreeItem(){};
|
||||||
|
|
||||||
|
IdString getData() { return this->data; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
IdString data;
|
||||||
|
};
|
||||||
|
|
||||||
|
class WireTreeItem : public ElementTreeItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WireTreeItem(IdString d, ElementType type, QString str)
|
||||||
|
: ElementTreeItem(type, str)
|
||||||
|
{
|
||||||
|
this->data = d;
|
||||||
|
}
|
||||||
|
virtual ~WireTreeItem(){};
|
||||||
|
|
||||||
|
IdString getData() { return this->data; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
IdString data;
|
||||||
|
};
|
||||||
|
|
||||||
|
class PipTreeItem : public ElementTreeItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PipTreeItem(IdString d, ElementType type, QString str)
|
||||||
|
: ElementTreeItem(type, str)
|
||||||
|
{
|
||||||
|
this->data = d;
|
||||||
|
}
|
||||||
|
virtual ~PipTreeItem(){};
|
||||||
|
|
||||||
|
IdString getData() { return this->data; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
IdString data;
|
||||||
|
};
|
||||||
|
|
||||||
MainWindow::MainWindow(Design *_design, QWidget *parent)
|
MainWindow::MainWindow(Design *_design, QWidget *parent)
|
||||||
: QMainWindow(parent), ui(new Ui::MainWindow), design(_design)
|
: QMainWindow(parent), ui(new Ui::MainWindow), design(_design)
|
||||||
{
|
{
|
||||||
@ -25,8 +95,8 @@ MainWindow::MainWindow(Design *_design, QWidget *parent)
|
|||||||
QList<QTreeWidgetItem *> bel_items;
|
QList<QTreeWidgetItem *> bel_items;
|
||||||
for (auto bel : design->chip.getBels()) {
|
for (auto bel : design->chip.getBels()) {
|
||||||
auto name = design->chip.getBelName(bel);
|
auto name = design->chip.getBelName(bel);
|
||||||
bel_items.append(new QTreeWidgetItem(
|
bel_items.append(
|
||||||
(QTreeWidget *)nullptr, QStringList(QString(name.c_str()))));
|
new BelTreeItem(name, ElementType::BEL, QString(name.c_str())));
|
||||||
}
|
}
|
||||||
bel_root->addChildren(bel_items);
|
bel_root->addChildren(bel_items);
|
||||||
|
|
||||||
@ -36,8 +106,8 @@ MainWindow::MainWindow(Design *_design, QWidget *parent)
|
|||||||
ui->treeWidget->insertTopLevelItem(0, wire_root);
|
ui->treeWidget->insertTopLevelItem(0, wire_root);
|
||||||
for (auto wire : design->chip.getWires()) {
|
for (auto wire : design->chip.getWires()) {
|
||||||
auto name = design->chip.getWireName(wire);
|
auto name = design->chip.getWireName(wire);
|
||||||
wire_items.append(new QTreeWidgetItem(
|
wire_items.append(new WireTreeItem(name, ElementType::WIRE,
|
||||||
(QTreeWidget *)nullptr, QStringList(QString(name.c_str()))));
|
QString(name.c_str())));
|
||||||
}
|
}
|
||||||
wire_root->addChildren(wire_items);
|
wire_root->addChildren(wire_items);
|
||||||
|
|
||||||
@ -47,8 +117,8 @@ MainWindow::MainWindow(Design *_design, QWidget *parent)
|
|||||||
ui->treeWidget->insertTopLevelItem(0, pip_root);
|
ui->treeWidget->insertTopLevelItem(0, pip_root);
|
||||||
for (auto pip : design->chip.getPips()) {
|
for (auto pip : design->chip.getPips()) {
|
||||||
auto name = design->chip.getPipName(pip);
|
auto name = design->chip.getPipName(pip);
|
||||||
pip_items.append(new QTreeWidgetItem(
|
pip_items.append(
|
||||||
(QTreeWidget *)nullptr, QStringList(QString(name.c_str()))));
|
new PipTreeItem(name, ElementType::PIP, QString(name.c_str())));
|
||||||
}
|
}
|
||||||
pip_root->addChildren(pip_items);
|
pip_root->addChildren(pip_items);
|
||||||
|
|
||||||
@ -65,191 +135,82 @@ MainWindow::MainWindow(Design *_design, QWidget *parent)
|
|||||||
|
|
||||||
variantManager = new QtVariantPropertyManager();
|
variantManager = new QtVariantPropertyManager();
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
QtProperty *topItem = variantManager->addProperty(
|
|
||||||
QtVariantPropertyManager::groupTypeId(),
|
|
||||||
QString::number(i++) + QLatin1String(" Group Property"));
|
|
||||||
|
|
||||||
QtVariantProperty *item = variantManager->addProperty(
|
|
||||||
QVariant::Bool,
|
|
||||||
QString::number(i++) + QLatin1String(" Bool Property"));
|
|
||||||
item->setValue(true);
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(QVariant::Int,
|
|
||||||
QString::number(i++) +
|
|
||||||
QLatin1String(" Int Property"));
|
|
||||||
item->setValue(20);
|
|
||||||
item->setAttribute(QLatin1String("minimum"), 0);
|
|
||||||
item->setAttribute(QLatin1String("maximum"), 100);
|
|
||||||
item->setAttribute(QLatin1String("singleStep"), 10);
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(
|
|
||||||
QVariant::Double,
|
|
||||||
QString::number(i++) + QLatin1String(" Double Property"));
|
|
||||||
item->setValue(1.2345);
|
|
||||||
item->setAttribute(QLatin1String("singleStep"), 0.1);
|
|
||||||
item->setAttribute(QLatin1String("decimals"), 3);
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(
|
|
||||||
QVariant::String,
|
|
||||||
QString::number(i++) + QLatin1String(" String Property"));
|
|
||||||
item->setValue("Value");
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(QVariant::Date,
|
|
||||||
QString::number(i++) +
|
|
||||||
QLatin1String(" Date Property"));
|
|
||||||
item->setValue(QDate::currentDate().addDays(2));
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(QVariant::Time,
|
|
||||||
QString::number(i++) +
|
|
||||||
QLatin1String(" Time Property"));
|
|
||||||
item->setValue(QTime::currentTime());
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(
|
|
||||||
QVariant::DateTime,
|
|
||||||
QString::number(i++) + QLatin1String(" DateTime Property"));
|
|
||||||
item->setValue(QDateTime::currentDateTime());
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(
|
|
||||||
QVariant::KeySequence,
|
|
||||||
QString::number(i++) + QLatin1String(" KeySequence Property"));
|
|
||||||
item->setValue(QKeySequence(Qt::ControlModifier | Qt::Key_Q));
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(QVariant::Char,
|
|
||||||
QString::number(i++) +
|
|
||||||
QLatin1String(" Char Property"));
|
|
||||||
item->setValue(QChar(386));
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(
|
|
||||||
QVariant::Locale,
|
|
||||||
QString::number(i++) + QLatin1String(" Locale Property"));
|
|
||||||
item->setValue(QLocale(QLocale::Polish, QLocale::Poland));
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(
|
|
||||||
QVariant::Point,
|
|
||||||
QString::number(i++) + QLatin1String(" Point Property"));
|
|
||||||
item->setValue(QPoint(10, 10));
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(
|
|
||||||
QVariant::PointF,
|
|
||||||
QString::number(i++) + QLatin1String(" PointF Property"));
|
|
||||||
item->setValue(QPointF(1.2345, -1.23451));
|
|
||||||
item->setAttribute(QLatin1String("decimals"), 3);
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(QVariant::Size,
|
|
||||||
QString::number(i++) +
|
|
||||||
QLatin1String(" Size Property"));
|
|
||||||
item->setValue(QSize(20, 20));
|
|
||||||
item->setAttribute(QLatin1String("minimum"), QSize(10, 10));
|
|
||||||
item->setAttribute(QLatin1String("maximum"), QSize(30, 30));
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(
|
|
||||||
QVariant::SizeF,
|
|
||||||
QString::number(i++) + QLatin1String(" SizeF Property"));
|
|
||||||
item->setValue(QSizeF(1.2345, 1.2345));
|
|
||||||
item->setAttribute(QLatin1String("decimals"), 3);
|
|
||||||
item->setAttribute(QLatin1String("minimum"), QSizeF(0.12, 0.34));
|
|
||||||
item->setAttribute(QLatin1String("maximum"), QSizeF(20.56, 20.78));
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(QVariant::Rect,
|
|
||||||
QString::number(i++) +
|
|
||||||
QLatin1String(" Rect Property"));
|
|
||||||
item->setValue(QRect(10, 10, 20, 20));
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
item->setAttribute(QLatin1String("constraint"), QRect(0, 0, 50, 50));
|
|
||||||
|
|
||||||
item = variantManager->addProperty(
|
|
||||||
QVariant::RectF,
|
|
||||||
QString::number(i++) + QLatin1String(" RectF Property"));
|
|
||||||
item->setValue(QRectF(1.2345, 1.2345, 1.2345, 1.2345));
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
item->setAttribute(QLatin1String("constraint"), QRectF(0, 0, 50, 50));
|
|
||||||
item->setAttribute(QLatin1String("decimals"), 3);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(QtVariantPropertyManager::enumTypeId(),
|
|
||||||
QString::number(i++) +
|
|
||||||
QLatin1String(" Enum Property"));
|
|
||||||
QStringList enumNames;
|
|
||||||
enumNames << "Enum0"
|
|
||||||
<< "Enum1"
|
|
||||||
<< "Enum2";
|
|
||||||
item->setAttribute(QLatin1String("enumNames"), enumNames);
|
|
||||||
item->setValue(1);
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(QtVariantPropertyManager::flagTypeId(),
|
|
||||||
QString::number(i++) +
|
|
||||||
QLatin1String(" Flag Property"));
|
|
||||||
QStringList flagNames;
|
|
||||||
flagNames << "Flag0"
|
|
||||||
<< "Flag1"
|
|
||||||
<< "Flag2";
|
|
||||||
item->setAttribute(QLatin1String("flagNames"), flagNames);
|
|
||||||
item->setValue(5);
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(
|
|
||||||
QVariant::SizePolicy,
|
|
||||||
QString::number(i++) + QLatin1String(" SizePolicy Property"));
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(QVariant::Font,
|
|
||||||
QString::number(i++) +
|
|
||||||
QLatin1String(" Font Property"));
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(
|
|
||||||
QVariant::Cursor,
|
|
||||||
QString::number(i++) + QLatin1String(" Cursor Property"));
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
item = variantManager->addProperty(
|
|
||||||
QVariant::Color,
|
|
||||||
QString::number(i++) + QLatin1String(" Color Property"));
|
|
||||||
topItem->addSubProperty(item);
|
|
||||||
|
|
||||||
variantFactory = new QtVariantEditorFactory();
|
variantFactory = new QtVariantEditorFactory();
|
||||||
|
|
||||||
variantEditor = new QtTreePropertyBrowser();
|
propertyEditor = new QtTreePropertyBrowser();
|
||||||
variantEditor->setFactoryForManager(variantManager, variantFactory);
|
propertyEditor->setFactoryForManager(variantManager, variantFactory);
|
||||||
variantEditor->addProperty(topItem);
|
propertyEditor->setPropertiesWithoutValueMarked(true);
|
||||||
variantEditor->setPropertiesWithoutValueMarked(true);
|
propertyEditor->setRootIsDecorated(false);
|
||||||
variantEditor->setRootIsDecorated(false);
|
propertyEditor->show();
|
||||||
variantEditor->show();
|
ui->splitter_2->addWidget(propertyEditor);
|
||||||
ui->splitter_2->addWidget(variantEditor);
|
|
||||||
|
connect(ui->treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)),
|
||||||
|
SLOT(onItemClicked(QTreeWidgetItem *, int)));
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
{
|
{
|
||||||
delete variantManager;
|
delete variantManager;
|
||||||
delete variantFactory;
|
delete variantFactory;
|
||||||
delete variantEditor;
|
delete propertyEditor;
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::addProperty(QtVariantProperty *property, const QString &id)
|
||||||
|
{
|
||||||
|
propertyToId[property] = id;
|
||||||
|
idToProperty[id] = property;
|
||||||
|
QtBrowserItem *item = propertyEditor->addProperty(property);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onItemClicked(QTreeWidgetItem *item, int pos)
|
||||||
|
{
|
||||||
|
if (!item->parent())
|
||||||
|
return;
|
||||||
|
ElementType type = static_cast<ElementTreeItem *>(item)->getType();
|
||||||
|
QMap<QtProperty *, QString>::ConstIterator itProp =
|
||||||
|
propertyToId.constBegin();
|
||||||
|
while (itProp != propertyToId.constEnd()) {
|
||||||
|
delete itProp.key();
|
||||||
|
itProp++;
|
||||||
|
}
|
||||||
|
propertyToId.clear();
|
||||||
|
idToProperty.clear();
|
||||||
|
|
||||||
|
if (type == ElementType::BEL) {
|
||||||
|
IdString c = static_cast<BelTreeItem *>(item)->getData();
|
||||||
|
|
||||||
|
QtVariantProperty *topItem =
|
||||||
|
variantManager->addProperty(QVariant::String, QString("Name"));
|
||||||
|
topItem->setValue(QString(c.c_str()));
|
||||||
|
addProperty(topItem, QString("Name"));
|
||||||
|
} else if (type == ElementType::WIRE) {
|
||||||
|
IdString c = static_cast<WireTreeItem *>(item)->getData();
|
||||||
|
|
||||||
|
QtVariantProperty *topItem =
|
||||||
|
variantManager->addProperty(QVariant::String, QString("Name"));
|
||||||
|
topItem->setValue(QString(c.c_str()));
|
||||||
|
addProperty(topItem, QString("Name"));
|
||||||
|
|
||||||
|
} else if (type == ElementType::PIP) {
|
||||||
|
IdString c = static_cast<PipTreeItem *>(item)->getData();
|
||||||
|
|
||||||
|
QtVariantProperty *topItem =
|
||||||
|
variantManager->addProperty(QVariant::String, QString("Name"));
|
||||||
|
topItem->setValue(QString(c.c_str()));
|
||||||
|
addProperty(topItem, QString("Name"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::prepareMenu(const QPoint &pos)
|
void MainWindow::prepareMenu(const QPoint &pos)
|
||||||
{
|
{
|
||||||
QTreeWidget *tree = ui->treeWidget;
|
QTreeWidget *tree = ui->treeWidget;
|
||||||
|
|
||||||
QTreeWidgetItem *item = tree->itemAt(pos);
|
itemContextMenu = tree->itemAt(pos);
|
||||||
|
|
||||||
QAction *selectAction = new QAction("&Select", this);
|
QAction *selectAction = new QAction("&Select", this);
|
||||||
selectAction->setStatusTip("Select item on view");
|
selectAction->setStatusTip("Select item on view");
|
||||||
connect(selectAction, SIGNAL(triggered()), this, SLOT(selectObject(item)));
|
connect(selectAction, SIGNAL(triggered()), this, SLOT(selectObject()));
|
||||||
|
|
||||||
QMenu menu(this);
|
QMenu menu(this);
|
||||||
menu.addAction(selectAction);
|
menu.addAction(selectAction);
|
||||||
@ -258,11 +219,12 @@ void MainWindow::prepareMenu(const QPoint &pos)
|
|||||||
menu.exec(tree->mapToGlobal(pos));
|
menu.exec(tree->mapToGlobal(pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::selectObject(QTreeWidgetItem *item)
|
void MainWindow::selectObject()
|
||||||
{
|
{
|
||||||
ui->plainTextEdit->moveCursor(QTextCursor::End);
|
ui->plainTextEdit->moveCursor(QTextCursor::End);
|
||||||
ui->plainTextEdit->insertPlainText(
|
ui->plainTextEdit->insertPlainText(
|
||||||
std::string("selected " + item->text(0).toStdString() + "\n")
|
std::string("selected " + itemContextMenu->text(0).toStdString() +
|
||||||
|
"\n")
|
||||||
.c_str());
|
.c_str());
|
||||||
ui->plainTextEdit->moveCursor(QTextCursor::End);
|
ui->plainTextEdit->moveCursor(QTextCursor::End);
|
||||||
}
|
}
|
||||||
|
@ -27,11 +27,13 @@ class MainWindow : public QMainWindow
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
int executePython(std::string command);
|
int executePython(std::string command);
|
||||||
|
void addProperty(QtVariantProperty *property, const QString &id);
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void on_lineEdit_returnPressed();
|
void on_lineEdit_returnPressed();
|
||||||
void prepareMenu(const QPoint &pos);
|
void prepareMenu(const QPoint &pos);
|
||||||
void selectObject(QTreeWidgetItem *item);
|
void selectObject();
|
||||||
|
void onItemClicked(QTreeWidgetItem *item, int);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::MainWindow *ui;
|
Ui::MainWindow *ui;
|
||||||
@ -39,7 +41,11 @@ class MainWindow : public QMainWindow
|
|||||||
Design *design;
|
Design *design;
|
||||||
QtVariantPropertyManager *variantManager;
|
QtVariantPropertyManager *variantManager;
|
||||||
QtVariantEditorFactory *variantFactory;
|
QtVariantEditorFactory *variantFactory;
|
||||||
QtTreePropertyBrowser *variantEditor;
|
QtTreePropertyBrowser *propertyEditor;
|
||||||
|
QTreeWidgetItem *itemContextMenu;
|
||||||
|
|
||||||
|
QMap<QtProperty *, QString> propertyToId;
|
||||||
|
QMap<QString, QtVariantProperty *> idToProperty;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
|
Loading…
Reference in New Issue
Block a user