2#include <QGraphicsSceneDragDropEvent>
22 : QGraphicsScene ( parent ),
33 setSceneRect ( QRectF ( 0, 0, 10000, 10000 ) );
43 m_add_class =
new QAction (
"&Add new class",
this );
63 m_toggle_default =
new QAction (
"Toggle showing of &default values of attributes",
this );
70 m_add_note =
new QAction (
"&Add note to view",
this );
110 if ( event->mimeData()->hasFormat (
"application/vnd.text.list" ) )
118 if ( event->mimeData()->hasFormat (
"application/vnd.text.list" ) )
126 QByteArray encodedData =
event->mimeData()->data (
"application/vnd.text.list" );
127 QDataStream stream ( &encodedData, QIODevice::ReadOnly );
129 if (stream.atEnd()) {
133 QStringList schema_classes;
134 while ( !stream.atEnd() )
137 stream >> class_name;
138 schema_classes.append ( class_name );
141 QList<QPointF> positions;
142 for (
int i = 0; i < schema_classes.size(); ++i )
144 positions.push_back ( event->scenePos() );
196 if ( itemAt ( event->scenePos(), QTransform() ) ) {
202 itemAt ( event->scenePos(), QTransform() ) );
204 itemAt ( event->scenePos(), QTransform() ) );
206 itemAt ( event->scenePos(), QTransform() ) );
208 if (
object !=
nullptr) {
219 else if ( arrow !=
nullptr ) {
223 else if ( note !=
nullptr) {
224 for (
int item=
m_note_pos; item<nitems; item++) {
235 QStringList SchemaClasses,
236 QList<QPointF> Positions )
238 QStringList missingItems{};
240 for ( QString & ClassName : SchemaClasses )
242 if ( !
ItemMap.contains ( ClassName ) )
246 std::cout <<
"ERROR: class " << ClassName.toStdString() <<
" not found" << std::endl;
247 missingItems.append(ClassName);
252 Object->setPos ( Positions.at ( SchemaClasses.indexOf ( ClassName ) ) );
255 ItemMap.insert ( ClassName, Object );
259 for ( QString & ClassName :
ItemMap.keys() )
263 const std::list<OksRelationship *> * DirectRelationshipList =
267 std::map<std::string, unsigned int> arrow_count;
270 if ( DirectRelationshipList !=
nullptr )
272 for (
OksRelationship * ClassRelationship : * ( DirectRelationshipList ) )
274 auto rct = ClassRelationship->get_class_type()->get_name();
275 QString RelationshipClassType = QString::fromStdString (rct);
277 if (
ItemMap.contains ( RelationshipClassType ) )
280 QString SchemaCardinality =
286 ClassRelationship->get_is_composite(),
287 QString::fromStdString ( ClassRelationship->get_name() ), SchemaCardinality );
288 ItemMap[ClassName]->AddArrow ( NewArrow );
289 ItemMap[RelationshipClassType]->AddArrow ( NewArrow );
290 addItem ( NewArrow );
292 NewArrow->setZValue ( -1000.0 );
300 if ( DirectSuperClassesList !=
nullptr )
302 for ( std::string * SuperClassNameStd : * ( DirectSuperClassesList ) )
304 QString SuperClassName = QString::fromStdString ( *SuperClassNameStd );
306 if (
ItemMap.contains ( SuperClassName ) )
312 arrow_count[*SuperClassNameStd],
315 ItemMap[ClassName]->AddArrow ( NewArrow );
316 ItemMap[SuperClassName]->AddArrow ( NewArrow );
317 addItem ( NewArrow );
319 NewArrow->setZValue ( -1000.0 );
321 arrow_count[*SuperClassNameStd]++;
336 QList<QPointF> positions ) {
337 for (
int index = 0; index<notes.size(); index++) {
341 note->setPos ( positions.at ( index ) );
347 if (note ==
nullptr) {
355 if ( Object ==
nullptr )
372 if ( itemAt ( mouseEvent->scenePos(), QTransform() ) ) {
377 if ( mouseEvent->button() != Qt::LeftButton )
382 if ( mouseEvent->widget()->cursor().shape() == Qt::CrossCursor )
384 m_line =
new QGraphicsLineItem ( QLineF ( mouseEvent->scenePos(), mouseEvent->scenePos() ) );
385 m_line->setPen ( QPen ( Qt::black, 2 ) );
391 QGraphicsScene::mousePressEvent ( mouseEvent );
398 QLineF newLine (
m_line->line().p1(), mouseEvent->scenePos() );
399 m_line->setLine ( newLine );
403 QGraphicsScene::mouseMoveEvent ( mouseEvent );
421 if ( itemAt ( mouseEvent->scenePos(), QTransform() ) ) {
422 auto item = itemAt(mouseEvent->scenePos(), QTransform() );
432 QList<QGraphicsItem *> startItems = items (
m_line->line().p1() );
434 if ( startItems.count() && startItems.first() ==
m_line )
436 startItems.removeFirst();
439 QList<QGraphicsItem *> endItems = items (
m_line->line().p2() );
441 if ( endItems.count() && endItems.first() ==
m_line )
443 endItems.removeFirst();
449 if ( startItems.count() > 0 && endItems.count() > 0
450 && startItems.first() != endItems.first() )
455 startItems.first() );
470 newArrow->setZValue ( -1000.0 );
471 addItem ( newArrow );
479 connect ( Editor, SIGNAL ( MakeGraphConnection ( QString, QString, QString ) ),
this,
480 SLOT (
DrawArrow ( QString, QString, QString ) ) );
487 QGraphicsScene::mouseReleaseEvent ( mouseEvent );
508 QString(
"#") + QString::number(
m_next_note++), QString());
523 ItemMap.insert(class_name,
object);
534 QString class_name = QString::fromStdString (
CurrentObject->GetClass()->get_name() );
556 item->update_arrows();
565 item->update_arrows();
572 QString class_name = QString::fromStdString (
CurrentObject->GetClass()->get_name() );
575 QStringList super_class_list;
576 QList<QPointF> positions;
579 if(direct_classes !=
nullptr) {
580 for(std::string * cl_name : *direct_classes) {
581 super_class_list.push_back(QString::fromStdString(*cl_name));
582 positions.push_back({0,0});
592 QString class_name = QString::fromStdString (
CurrentObject->GetClass()->get_name() );
595 QStringList super_class_list;
596 QList<QPointF> positions;
599 if(all_classes !=
nullptr) {
600 for(
const OksClass* cl : *all_classes) {
601 super_class_list.push_back(QString::fromStdString(cl->get_name()));
602 positions.push_back({0,0});
613 QString class_name = QString::fromStdString (
CurrentObject->GetClass()->get_name() );
616 QStringList sub_class_list;
617 QList<QPointF> positions;
620 if(all_classes !=
nullptr) {
621 for(
const OksClass* cl : *all_classes) {
622 sub_class_list.push_back(QString::fromStdString(cl->get_name()));
623 positions.push_back({0,0});
633 QString class_name = QString::fromStdString (
CurrentObject->GetClass()->get_name() );
636 QStringList relationship_classes;
637 QList<QPointF> positions;
639 const std::list<OksRelationship *> * direct_relationship_list = class_info->
direct_relationships();
640 if ( direct_relationship_list !=
nullptr ) {
642 relationship_classes.push_back(QString::fromStdString(rl->get_type()));
643 positions.push_back({0,0});
654 QString class_name = QString::fromStdString (
CurrentObject->GetClass()->get_name() );
657 QStringList relationship_classes;
658 QList<QPointF> positions;
660 const std::list<OksRelationship *> * all_relationship_list = class_info->
all_relationships();
661 if ( all_relationship_list !=
nullptr ) {
663 relationship_classes.push_back(QString::fromStdString(rl->get_type()));
664 positions.push_back({0,0});
693 QString RelationshipName )
695 if ( !
ItemMap.contains ( ClassName ) || !
ItemMap.contains ( RelationshipType ) )
705 RelationshipName.toStdString() );
707 if ( SchemaRelationship !=
nullptr )
709 QString RelationshipCardinality =
715 QString::fromStdString ( SchemaRelationship->
get_name() ), RelationshipCardinality );
718 newArrow->setZValue ( -1000.0 );
719 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)
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