2#include <QGraphicsSceneDragDropEvent>
10#include <QApplication>
24 : QGraphicsScene ( parent ),
31 setSceneRect ( QRectF ( 0, 0, 10000, 10000 ) );
34 settings.beginGroup(
"view defaults");
51 m_add_class =
new QAction (
"&Add new class",
this );
77 m_toggle_default =
new QAction (
"Show &default values of attributes",
this );
87 m_add_note =
new QAction (
"&Add note to view",
this );
124 m_save =
new QAction(
"&Save view",
this);
127 m_move =
new QAction(
"&Move scene",
this);
133 if ( event->mimeData()->hasFormat (
"application/vnd.text.list" ) )
141 if ( event->mimeData()->hasFormat (
"application/vnd.text.list" ) )
149 QByteArray encodedData =
event->mimeData()->data (
"application/vnd.text.list" );
150 QDataStream stream ( &encodedData, QIODevice::ReadOnly );
152 if (stream.atEnd()) {
156 QStringList schema_classes;
157 while ( !stream.atEnd() )
160 stream >> class_name;
161 schema_classes.append ( class_name );
164 QList<QPointF> positions;
165 for (
int i = 0; i < schema_classes.size(); ++i )
167 positions.push_back ( event->scenePos() );
234 if ( itemAt ( event->scenePos(), QTransform() ) ) {
240 itemAt ( event->scenePos(), QTransform() ) );
242 itemAt ( event->scenePos(), QTransform() ) );
244 itemAt ( event->scenePos(), QTransform() ) );
246 if (
object !=
nullptr) {
259 else if ( arrow !=
nullptr ) {
263 else if ( note !=
nullptr) {
264 for (
int item=
m_note_pos; item<nitems; item++) {
275 QStringList SchemaClasses,
276 QList<QPointF> Positions )
278 QStringList missingItems{};
280 for ( QString & ClassName : SchemaClasses )
282 if ( !
ItemMap.contains ( ClassName ) )
286 std::cout <<
"ERROR: class " << ClassName.toStdString() <<
" not found" << std::endl;
287 missingItems.append(ClassName);
292 Object->setPos ( Positions.at ( SchemaClasses.indexOf ( ClassName ) ) );
295 ItemMap.insert ( ClassName, Object );
299 for ( QString & ClassName :
ItemMap.keys() )
303 const std::list<OksRelationship *> * DirectRelationshipList =
307 std::map<std::string, unsigned int> arrow_count;
310 if ( DirectRelationshipList !=
nullptr )
312 for (
OksRelationship * ClassRelationship : * ( DirectRelationshipList ) )
314 auto rct = ClassRelationship->get_class_type()->get_name();
315 QString RelationshipClassType = QString::fromStdString (rct);
317 if (
ItemMap.contains ( RelationshipClassType ) )
320 QString SchemaCardinality =
326 ClassRelationship->get_is_composite(),
327 QString::fromStdString ( ClassRelationship->get_name() ), SchemaCardinality );
328 ItemMap[ClassName]->AddArrow ( NewArrow );
329 ItemMap[RelationshipClassType]->AddArrow ( NewArrow );
330 addItem ( NewArrow );
332 NewArrow->setZValue ( -1000.0 );
340 if ( DirectSuperClassesList !=
nullptr )
342 for ( std::string * SuperClassNameStd : * ( DirectSuperClassesList ) )
344 QString SuperClassName = QString::fromStdString ( *SuperClassNameStd );
346 if (
ItemMap.contains ( SuperClassName ) )
352 arrow_count[*SuperClassNameStd],
355 ItemMap[ClassName]->AddArrow ( NewArrow );
356 ItemMap[SuperClassName]->AddArrow ( NewArrow );
357 addItem ( NewArrow );
359 NewArrow->setZValue ( -1000.0 );
361 arrow_count[*SuperClassNameStd]++;
376 QList<QPointF> positions ) {
377 for (
int index = 0; index<notes.size(); index++) {
381 note->setPos ( positions.at ( index ) );
388 if (note ==
nullptr) {
396 if ( Object ==
nullptr )
413 if ( itemAt ( mouseEvent->scenePos(), QTransform() ) ) {
418 if ( mouseEvent->button() != Qt::LeftButton )
423 if ( mouseEvent->widget()->cursor().shape() == Qt::CrossCursor )
425 m_line =
new QGraphicsLineItem ( QLineF ( mouseEvent->scenePos(), mouseEvent->scenePos() ) );
426 m_line->setPen ( QPen ( Qt::black, 2 ) );
432 QGraphicsScene::mousePressEvent ( mouseEvent );
439 QLineF newLine (
m_line->line().p1(), mouseEvent->scenePos() );
440 m_line->setLine ( newLine );
444 QGraphicsScene::mouseMoveEvent ( mouseEvent );
461 auto pos =
obj->pos();
462 if (pos.x() < minx) {
465 if (pos.y() < miny) {
472 obj->setX(
obj->x()+xoffset);
473 obj->setY(
obj->y()+yoffset);
474 obj->update_arrows();
477 obj->setX(
obj->x()+xoffset);
478 obj->setY(
obj->y()+yoffset);
492 if ( itemAt ( mouseEvent->scenePos(), QTransform() ) ) {
493 auto item = itemAt(mouseEvent->scenePos(), QTransform() );
503 QList<QGraphicsItem *> startItems = items (
m_line->line().p1() );
505 if ( startItems.count() && startItems.first() ==
m_line )
507 startItems.removeFirst();
510 QList<QGraphicsItem *> endItems = items (
m_line->line().p2() );
512 if ( endItems.count() && endItems.first() ==
m_line )
514 endItems.removeFirst();
520 if ( startItems.count() > 0 && endItems.count() > 0
521 && startItems.first() != endItems.first() )
526 startItems.first() );
541 newArrow->setZValue ( -1000.0 );
542 addItem ( newArrow );
550 connect ( Editor, SIGNAL ( MakeGraphConnection ( QString, QString, QString ) ),
this,
551 SLOT (
DrawArrow ( QString, QString, QString ) ) );
558 QGraphicsScene::mouseReleaseEvent ( mouseEvent );
581 QString(
"#") + QString::number(
m_next_note++), QString());
596 ItemMap.insert(class_name,
object);
607 QString class_name = QString::fromStdString (
CurrentObject->GetClass()->get_name() );
629 item->update_arrows();
638 item->update_arrows();
645 QString class_name = QString::fromStdString (
CurrentObject->GetClass()->get_name() );
648 QStringList super_class_list;
649 QList<QPointF> positions;
652 if(direct_classes !=
nullptr) {
653 for(std::string * cl_name : *direct_classes) {
654 super_class_list.push_back(QString::fromStdString(*cl_name));
655 positions.push_back({0,0});
665 QString class_name = QString::fromStdString (
CurrentObject->GetClass()->get_name() );
668 QStringList super_class_list;
669 QList<QPointF> positions;
672 if(all_classes !=
nullptr) {
673 for(
const OksClass* cl : *all_classes) {
674 super_class_list.push_back(QString::fromStdString(cl->get_name()));
675 positions.push_back({0,0});
686 QString class_name = QString::fromStdString (
CurrentObject->GetClass()->get_name() );
689 QStringList sub_class_list;
690 QList<QPointF> positions;
693 if(all_classes !=
nullptr) {
694 for(
const OksClass* cl : *all_classes) {
695 sub_class_list.push_back(QString::fromStdString(cl->get_name()));
696 positions.push_back({0,0});
706 QString class_name = QString::fromStdString (
CurrentObject->GetClass()->get_name() );
709 QStringList relationship_classes;
710 QList<QPointF> positions;
712 const std::list<OksRelationship *> * direct_relationship_list = class_info->
direct_relationships();
713 if ( direct_relationship_list !=
nullptr ) {
715 relationship_classes.push_back(QString::fromStdString(rl->get_type()));
716 positions.push_back({0,0});
727 QString class_name = QString::fromStdString (
CurrentObject->GetClass()->get_name() );
730 QStringList relationship_classes;
731 QList<QPointF> positions;
733 const std::list<OksRelationship *> * all_relationship_list = class_info->
all_relationships();
734 if ( all_relationship_list !=
nullptr ) {
736 relationship_classes.push_back(QString::fromStdString(rl->get_type()));
737 positions.push_back({0,0});
766 QString RelationshipName )
768 if ( !
ItemMap.contains ( ClassName ) || !
ItemMap.contains ( RelationshipType ) )
778 RelationshipName.toStdString() );
780 if ( SchemaRelationship !=
nullptr )
782 QString RelationshipCardinality =
788 QString::fromStdString ( SchemaRelationship->
get_name() ), RelationshipCardinality );
791 newArrow->setZValue ( -1000.0 );
792 addItem ( newArrow );
static KernelWrapper & GetInstance()
QString GetCardinalityStringRelationship(dunedaq::oks::OksRelationship *SchemaRelationship) const
dunedaq::oks::OksClass * FindClass(std::string ClassName) const
bool GetInheritanceMode() const
bool IsFileWritable(const std::string &FileName) const
static void launch(QString class_name)
static QString createNewClass()
void AddArrow(SchemaGraphicSegmentedArrow *Arrow)
Arrow API.
QString GetClassName() const
dunedaq::oks::OksClass * GetClass() const
QStringList AddItemsToScene(QStringList SchemaClasses, QList< QPointF > Positions)
bool m_inherited_properties_visible
SchemaGraphicsScene(QObject *parent=nullptr)
QAction * m_add_direct_super_classes
void AddAllSubClassesSlot()
QAction * m_toggle_highlight_active
QAction * m_toggle_highlight_abstract
void ToggleHighlightActive()
void AddDirectRelationshipClassesSlot()
void ToggleHighlightClass()
void AddAllRelationshipClassesSlot()
void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
bool m_highlight_abstract
QAction * m_add_direct_relationship_classes
void dragEnterEvent(QGraphicsSceneDragDropEvent *event)
Drag & Drop.
void modified(bool state)
void ToggleHighlightAbstract()
QAction * m_toggle_indirect_infos
void contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
std::set< SchemaGraphicNote * > m_notes
void add_note_slot(SchemaGraphicNote *)
QAction * m_toggle_default
SchemaGraphicSegmentedArrow * m_current_arrow
void dropEvent(QGraphicsSceneDragDropEvent *event)
QAction * m_toggle_highlight_class
void add_notes(QStringList notes, QList< QPointF > positions)
QGraphicsLineItem * m_line
void ToggleIndirectInfos()
QAction * m_add_all_sub_classes
void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
void AddDirectSuperClassesSlot()
void add_class_slot(QString)
void DrawArrow(QString ClassName, QString RelationshipType, QString RelationshipName)
void remove_note_object(SchemaGraphicNote *obj)
QAction * m_add_all_super_classes
QMetaObject::Connection m_addclass_connection
SchemaGraphicObject * CurrentObject
SchemaGraphicNote * m_current_note
void AddAllSuperClassesSlot()
void RemoveItemFromScene(QGraphicsItem *item)
void dragMoveEvent(QGraphicsSceneDragDropEvent *event)
void RemoveClassObject(SchemaGraphicObject *Object)
void cancel_note_slot(SchemaGraphicNote *)
QMap< QString, SchemaGraphicObject * > ItemMap
QAction * m_add_all_relationship_classes
const FList * all_sub_classes() const noexcept
OksRelationship * find_direct_relationship(const std::string &name) const noexcept
Find direct relationship.
void add_super_class(const std::string &name)
std::list< OksClass *, boost::fast_pool_allocator< OksClass * > > FList
const FList * all_super_classes() const noexcept
const std::list< OksRelationship * > * direct_relationships() const noexcept
const std::list< std::string * > * direct_super_classes() const noexcept
const std::list< OksRelationship * > * all_relationships() const noexcept
bool get_is_composite() const noexcept
const std::string & get_name() const noexcept