Added drag&drop to insert component or bus instances
This commit is contained in:
1 parent
0a658a4aba
commit
cbff8ff5f2
10 files changed
+196
-13
No files matched your search
@@ -6,6 +6,7 @@
|
||||
#include <QMenu>
|
||||
#include <QGraphicsSceneContextMenuEvent>
|
||||
#include <iostream>
|
||||
#include <QDebug>
|
||||
|
||||
namespace display {
|
||||
|
||||
@@ -35,8 +36,36 @@ void Component::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
|
||||
menu.exec(event->screenPos());
|
||||
}
|
||||
|
||||
void Pin::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
|
||||
QMenu menu;
|
||||
menu.addAction("Connect pin", [&]() {});
|
||||
menu.exec(event->screenPos());
|
||||
}
|
||||
|
||||
void Bus::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
|
||||
void Pin::mousePressEvent(QGraphicsSceneMouseEvent *event) {
|
||||
if(event->button() == Qt::MouseButton::LeftButton) {
|
||||
auto view = dynamic_cast<Schema*>(this->scene()->views()[0]);
|
||||
view->state = Schema::CREATING_CONNECTION;
|
||||
view->context.pin = this;
|
||||
view->context.startingPoint = view->mapToScene(event->pos().toPoint());
|
||||
}
|
||||
}
|
||||
|
||||
void Pin::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
|
||||
auto view = dynamic_cast<Schema*>(this->scene()->views()[0]);
|
||||
if(view->state == Schema::CREATING_CONNECTION) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void Pin::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
|
||||
if(event->button() == Qt::MouseButton::LeftButton) {
|
||||
auto view = dynamic_cast<Schema*>(this->scene()->views()[0]);
|
||||
view->state = Schema::DEFAULT;
|
||||
}
|
||||
}
|
||||
|
||||
void Bus::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
|
||||
QMenu menu;
|
||||
menu.addAction("Izmjeni ime", [this](){
|
||||
auto dialog = new NameDialog(this->busInstance.get());
|
||||
@@ -107,4 +136,5 @@ void Bus::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
|
||||
}
|
||||
menu.exec(event->screenPos());
|
||||
}
|
||||
|
||||
} // namespace display
|
||||
@@ -5,6 +5,8 @@
|
||||
#include <comdel/domain/wireinstance.h>
|
||||
|
||||
#include <QGraphicsItemGroup>
|
||||
#include <QGraphicsSceneMouseEvent>
|
||||
#include <QGraphicsSceneMouseEvent>
|
||||
#include "comdel/domain/connectioninstance.h"
|
||||
|
||||
namespace display {
|
||||
@@ -17,6 +19,12 @@ public:
|
||||
Pin(domain::Pin pin): pin(pin) {
|
||||
pin.getDisplayPin().render(this);
|
||||
}
|
||||
|
||||
void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override;
|
||||
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
|
||||
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
|
||||
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
|
||||
|
||||
};
|
||||
|
||||
class Component: public QGraphicsItemGroup
|
||||
|
||||
@@ -11,8 +11,8 @@ Library::Library()
|
||||
auto layout = new QVBoxLayout();
|
||||
this->setLayout(layout);
|
||||
|
||||
componentList = new QListWidget();
|
||||
busList = new QListWidget();
|
||||
componentList = new LibraryList(this);
|
||||
busList = new LibraryList(this);
|
||||
|
||||
layout->setMargin(4);
|
||||
layout->addWidget(new QLabel("Components:"));
|
||||
@@ -34,14 +34,14 @@ void Library::setLibrary(std::optional<domain::Library> library) {
|
||||
}
|
||||
|
||||
for(auto& component: library->getComponents()) {
|
||||
auto item = new QListWidgetItem{QString::fromStdString(component.getName())};
|
||||
auto item = new LibraryListItem{component.getName(), "comdel/component", component.getName(), componentList};
|
||||
item->setToolTip(QString::fromStdString(component.getTooltip()));
|
||||
componentList->addItem(item);
|
||||
}
|
||||
|
||||
for(auto& bus: library->getBuses()) {
|
||||
if(bus.getType() == domain::Bus::REGULAR) {
|
||||
auto item = new QListWidgetItem{QString::fromStdString(bus.getName())};
|
||||
auto item = new LibraryListItem{bus.getName(), "comdel/bus", bus.getName(), busList};
|
||||
item->setToolTip(QString::fromStdString(bus.getTooltip()));
|
||||
busList->addItem(item);
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <QWidget>
|
||||
|
||||
#include <comdel/domain/library.h>
|
||||
#include "library_list.h"
|
||||
|
||||
namespace display {
|
||||
|
||||
@@ -18,8 +19,8 @@ public:
|
||||
private:
|
||||
std::optional<domain::Library> library;
|
||||
|
||||
QListWidget *componentList;
|
||||
QListWidget *busList;
|
||||
LibraryList *componentList;
|
||||
LibraryList *busList;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
//
|
||||
// Created by bbr on 22.05.22..
|
||||
//
|
||||
|
||||
#include "library_list.h"
|
||||
|
||||
#include <QMouseEvent>
|
||||
#include <QDrag>
|
||||
#include <QMimeData>
|
||||
|
||||
namespace display {
|
||||
|
||||
LibraryList::LibraryList(QWidget *parent): QListWidget(parent) {
|
||||
setDragDropMode(DragOnly);
|
||||
}
|
||||
|
||||
QMimeData *LibraryList::mimeData(const QList<QListWidgetItem *> items) const {
|
||||
for(auto qItem: items) {
|
||||
// we only allow one item to be dragged at a time
|
||||
auto item = dynamic_cast<LibraryListItem*>(qItem);
|
||||
auto* md = new QMimeData();
|
||||
md->setData(QString::fromStdString(item->mimeType), QByteArray::fromStdString(item->value));
|
||||
return md;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
LibraryListItem::LibraryListItem(std::string title, std::string mimeType, std::string value, QListWidget *parent): QListWidgetItem(parent), mimeType(mimeType), value(value) {
|
||||
setText(QString::fromStdString(title));
|
||||
}
|
||||
} // display
|
||||
@@ -0,0 +1,34 @@
|
||||
//
|
||||
// Created by bbr on 22.05.22..
|
||||
//
|
||||
|
||||
#ifndef SCHEMEEDITOR_LIBRARY_LIST_H
|
||||
#define SCHEMEEDITOR_LIBRARY_LIST_H
|
||||
|
||||
#include <QListWidget>
|
||||
#include <QList>
|
||||
#include <QMimeData>
|
||||
|
||||
namespace display {
|
||||
|
||||
class LibraryList: public QListWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
LibraryList(QWidget *parent);
|
||||
|
||||
protected:
|
||||
QMimeData *mimeData(const QList<QListWidgetItem*> items) const override;
|
||||
};
|
||||
|
||||
class LibraryListItem: public QListWidgetItem {
|
||||
|
||||
public:
|
||||
std::string mimeType;
|
||||
std::string value;
|
||||
|
||||
LibraryListItem(std::string title, std::string mimeType, std::string value, QListWidget *parent);
|
||||
};
|
||||
|
||||
} // display
|
||||
|
||||
#endif //SCHEMEEDITOR_LIBRARY_LIST_H
|
||||
@@ -1,15 +1,22 @@
|
||||
#include "component_display.h"
|
||||
#include "schema_display.h"
|
||||
|
||||
#include <QDrag>
|
||||
#include <QDragEnterEvent>
|
||||
#include <QDropEvent>
|
||||
#include <QMimeData>
|
||||
#include <iostream>
|
||||
|
||||
namespace display {
|
||||
|
||||
Schema::Schema()
|
||||
{
|
||||
this->setScene(&scene);
|
||||
this->setAcceptDrops(true);
|
||||
}
|
||||
|
||||
|
||||
void Schema::setSchema(domain::Schema* _schema)
|
||||
void Schema::setSchema(domain::Schema* _schema, domain::Library* _library)
|
||||
{
|
||||
std::map<std::string, display::ComponentGroup*> components;
|
||||
std::map<std::string, display::BusGroup*> buses;
|
||||
@@ -17,6 +24,7 @@ void Schema::setSchema(domain::Schema* _schema)
|
||||
scene.clear();
|
||||
connections.clear();
|
||||
this->schema = _schema;
|
||||
this->library = _library;
|
||||
if(schema != nullptr) {
|
||||
for(auto &instance: schema->componentInstances) {
|
||||
auto group = new display::ComponentGroup(instance);
|
||||
@@ -49,4 +57,51 @@ void Schema::updateConnections() {
|
||||
}
|
||||
}
|
||||
|
||||
void Schema::dragEnterEvent(QDragEnterEvent *event) {
|
||||
if(event->mimeData()->hasFormat("comdel/component") ||
|
||||
event->mimeData()->hasFormat("comdel/bus")) {
|
||||
event->acceptProposedAction();
|
||||
} else {
|
||||
std::cout<<"false"<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void Schema::dropEvent(QDropEvent *event) {
|
||||
if(event->mimeData()->hasFormat("comdel/component")) {
|
||||
auto component = library->getComponent(event->mimeData()->data("comdel/component").toStdString());
|
||||
|
||||
auto attributes = std::vector<domain::InstanceAttribute>();
|
||||
for(auto attr: component.getAttributes()) {
|
||||
attributes.emplace_back(attr.getName(), attr.getDefault(), attr);
|
||||
}
|
||||
|
||||
auto currentPos = this->mapToScene(event->pos());
|
||||
|
||||
auto instance = std::make_shared<domain::ComponentInstance>(component.getInstanceName(), attributes, std::make_pair(currentPos.x(), currentPos.y()), component);
|
||||
schema->componentInstances.push_back(instance);
|
||||
|
||||
auto group = new display::ComponentGroup(instance);
|
||||
scene.addItem(group);
|
||||
|
||||
event->acceptProposedAction();
|
||||
}
|
||||
if(event->mimeData()->hasFormat("comdel/bus")) {
|
||||
auto bus = library->getBus(event->mimeData()->data("comdel/bus").toStdString());
|
||||
|
||||
auto currentPos = this->mapToScene(event->pos());
|
||||
|
||||
auto instance = std::make_shared<domain::BusInstance>(bus.getName(), std::make_pair(currentPos.x(), currentPos.y()), bus, 50);
|
||||
schema->busInstances.push_back(instance);
|
||||
|
||||
auto group = new display::BusGroup(instance);
|
||||
scene.addItem(group);
|
||||
|
||||
event->acceptProposedAction();
|
||||
}
|
||||
}
|
||||
|
||||
void Schema::dragMoveEvent(QDragMoveEvent *event) {
|
||||
event->acceptProposedAction();
|
||||
}
|
||||
|
||||
} // namespace display
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <QWidget>
|
||||
|
||||
#include <comdel/domain/schema.h>
|
||||
#include <comdel/domain/library.h>
|
||||
|
||||
namespace display {
|
||||
|
||||
@@ -13,19 +14,42 @@ namespace display {
|
||||
|
||||
class Schema: public QGraphicsView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
enum State {
|
||||
DEFAULT,
|
||||
CREATING_CONNECTION
|
||||
};
|
||||
|
||||
struct Context {
|
||||
display::Pin *pin;
|
||||
QPointF startingPoint;
|
||||
};
|
||||
|
||||
State state = DEFAULT;
|
||||
Context context;
|
||||
|
||||
Schema();
|
||||
|
||||
std::vector<BusConnection*> connections;
|
||||
|
||||
void setSchema(domain::Schema* schema);
|
||||
void setSchema(domain::Schema* schema, domain::Library* library);
|
||||
|
||||
void updateConnections();
|
||||
|
||||
protected:
|
||||
|
||||
void dragEnterEvent(QDragEnterEvent *event) override;
|
||||
void dropEvent(QDropEvent *event) override;
|
||||
void dragMoveEvent(QDragMoveEvent *event) override;
|
||||
|
||||
private:
|
||||
QGraphicsScene scene;
|
||||
|
||||
domain::Schema* schema;
|
||||
domain::Library* library;
|
||||
};
|
||||
|
||||
} // namespace display
|
||||
|
||||
Reference in new issue
Block a user