22 : QGraphicsScene ( parent ),
24 m_context_menu ( nullptr ),
25 CurrentObject ( nullptr ),
26 m_current_arrow ( nullptr ),
27 m_inherited_properties_visible(false),
28 m_highlight_active(false),
32 setSceneRect ( QRectF ( 0, 0, 10000, 10000 ) );
42 m_add_class =
new QAction (
"&Add new class",
this );
43 connect ( m_add_class, SIGNAL ( triggered() ),
this, SLOT ( new_class_slot() ) );
46 m_edit_class =
new QAction (
"&Edit class",
this );
47 connect ( m_edit_class, SIGNAL ( triggered() ),
this, SLOT ( EditClassSlot() ) );
50 m_toggle_indirect_infos =
new QAction (
"&Toggle inherited properties",
this );
51 connect ( m_toggle_indirect_infos, SIGNAL ( triggered() ),
this, SLOT ( ToggleIndirectInfos() ) );
54 m_toggle_highlight_active =
new QAction (
"Toggle &highlighting of classes in active schema",
this );
55 connect ( m_toggle_highlight_active, SIGNAL ( triggered() ),
this, SLOT ( ToggleHighlightActive() ) );
57 m_add_note =
new QAction (
"Add note to view",
this );
58 connect ( m_add_note, SIGNAL ( triggered() ),
this, SLOT ( new_note_slot() ) );
60 m_edit_note =
new QAction (
"Edit note",
this );
61 connect ( m_edit_note, SIGNAL ( triggered() ),
this, SLOT ( edit_note_slot() ) );
63 m_remove_note =
new QAction (
"Remove note",
this );
64 connect ( m_remove_note, SIGNAL ( triggered() ),
this, SLOT ( remove_note_slot() ) );
67 m_add_direct_super_classes =
new QAction (
"Add direct &superclasses to view",
this );
68 connect ( m_add_direct_super_classes, SIGNAL ( triggered() ),
this, SLOT ( AddDirectSuperClassesSlot() ) );
71 m_add_direct_relationship_classes =
new QAction (
"Add &direct relationship classes to view",
this );
72 connect ( m_add_direct_relationship_classes, SIGNAL ( triggered() ),
this, SLOT ( AddDirectRelationshipClassesSlot() ) );
75 m_add_all_super_classes =
new QAction (
"Add all &superclasses to view",
this );
76 connect ( m_add_all_super_classes, SIGNAL ( triggered() ),
this, SLOT ( AddAllSuperClassesSlot() ) );
79 m_add_all_sub_classes =
new QAction (
"Add all s&ubclasses to view",
this );
80 connect ( m_add_all_sub_classes, SIGNAL ( triggered() ),
this, SLOT ( AddAllSubClassesSlot() ) );
83 m_add_all_relationship_classes =
new QAction (
"Add a&ll relationship classes to view",
this );
84 connect ( m_add_all_relationship_classes, SIGNAL ( triggered() ),
this, SLOT ( AddAllRelationshipClassesSlot() ) );
87 m_remove_class =
new QAction (
"&Remove Class from view",
this );
88 connect ( m_remove_class, SIGNAL ( triggered() ),
this, SLOT ( RemoveClassSlot() ) );
91 m_remove_arrow =
new QAction (
"&Remove Arrow",
this );
92 connect ( m_remove_arrow, SIGNAL ( triggered() ),
this, SLOT ( RemoveArrowSlot() ) );
113 QByteArray encodedData =
event->mimeData()->data (
"application/vnd.text.list" );
114 QDataStream stream ( &encodedData, QIODevice::ReadOnly );
115 QStringList SchemaClasses;
117 while ( !stream.atEnd() )
121 SchemaClasses.append ( ClassName );
124 QList<QPointF> Positions;
126 for (
int i = 0; i < SchemaClasses.size(); ++i )
128 Positions.push_back ( event->scenePos() );
131 AddItemsToScene ( SchemaClasses, Positions );
136 if ( m_context_menu ==
nullptr ) {
137 m_context_menu =
new QMenu();
138 m_context_menu->addAction ( m_add_class );
139 m_context_menu->addAction ( m_add_note );
140 m_context_menu->addAction ( m_toggle_indirect_infos );
141 m_context_menu->addAction ( m_toggle_highlight_active );
143 m_seperator_pos = m_context_menu->actions().size();
144 m_context_menu->addSeparator();
146 m_class_pos = m_context_menu->actions().size();
147 m_context_menu->addAction ( m_edit_class );
148 m_context_menu->addAction ( m_remove_class );
149 m_context_menu->addAction ( m_add_direct_super_classes );
150 m_context_menu->addAction ( m_add_direct_relationship_classes );
151 m_context_menu->addAction ( m_add_all_super_classes );
152 m_context_menu->addAction ( m_add_all_sub_classes );
153 m_context_menu->addAction ( m_add_all_sub_classes );
154 m_context_menu->addAction ( m_add_all_relationship_classes );
156 m_arrow_pos = m_context_menu->actions().size();
157 m_context_menu->addAction ( m_remove_arrow );
159 m_note_pos = m_context_menu->actions().size();
160 m_context_menu->addAction ( m_edit_note );
161 m_context_menu->addAction ( m_remove_note );
164 for (
int item=0; item<m_seperator_pos; item++) {
165 m_context_menu->actions().at ( item )->setVisible (
true );
169 int nitems = m_context_menu->actions().size();
170 for (
int item=m_seperator_pos; item<nitems; item++) {
171 m_context_menu->actions().at ( item )->setVisible (
false );
174 if ( itemAt ( event->scenePos(), QTransform() ) ) {
177 m_context_menu->actions().at ( m_seperator_pos )->setVisible (
true );
180 itemAt ( event->scenePos(), QTransform() ) );
182 itemAt ( event->scenePos(), QTransform() ) );
184 itemAt ( event->scenePos(), QTransform() ) );
186 if (
object !=
nullptr) {
187 CurrentObject = object;
189 CurrentObject->GetClass()->get_file()->get_full_file_name();
191 m_context_menu->actions().at ( m_class_pos )->setVisible ( writable );
192 m_context_menu->actions().at ( m_class_pos+1 )->setVisible ( writable );
193 for (
int item=m_class_pos+2; item<m_arrow_pos; item++) {
194 m_context_menu->actions().at ( item )->setVisible (
true );
197 else if ( arrow !=
nullptr ) {
198 m_context_menu->actions().at ( m_arrow_pos )->setVisible (
true );
199 m_current_arrow = arrow;
201 else if ( note !=
nullptr) {
202 for (
int item=m_note_pos; item<nitems; item++) {
203 m_context_menu->actions().at ( item )->setVisible (
true );
205 m_current_note = note;
208 m_current_pos =
event->scenePos();
209 m_context_menu->exec ( event->screenPos() );
213 QStringList SchemaClasses,
214 QList<QPointF> Positions )
216 QStringList missingItems{};
218 for ( QString & ClassName : SchemaClasses )
220 if ( !ItemMap.contains ( ClassName ) )
224 std::cout <<
"ERROR: class " << ClassName.toStdString() <<
" not found" << std::endl;
225 missingItems.append(ClassName);
230 Object->setPos ( Positions.at ( SchemaClasses.indexOf ( ClassName ) ) );
235 ItemMap.insert ( ClassName, Object );
239 for ( QString & ClassName : ItemMap.keys() )
243 const std::list<OksRelationship *> * DirectRelationshipList =
247 std::map<std::string, unsigned int> arrow_count;
250 if ( DirectRelationshipList !=
nullptr )
252 for (
OksRelationship * ClassRelationship : * ( DirectRelationshipList ) )
254 auto rct = ClassRelationship->get_class_type()->get_name();
255 QString RelationshipClassType = QString::fromStdString (rct);
257 if ( ItemMap.contains ( RelationshipClassType ) )
260 QString SchemaCardinality =
263 ItemMap[ClassName], ItemMap[RelationshipClassType],
266 ClassRelationship->get_is_composite(),
267 QString::fromStdString ( ClassRelationship->get_name() ), SchemaCardinality );
268 ItemMap[ClassName]->AddArrow ( NewArrow );
269 ItemMap[RelationshipClassType]->AddArrow ( NewArrow );
270 addItem ( NewArrow );
272 NewArrow->setZValue ( -1000.0 );
280 if ( DirectSuperClassesList !=
nullptr )
282 for ( std::string * SuperClassNameStd : * ( DirectSuperClassesList ) )
284 QString SuperClassName = QString::fromStdString ( *SuperClassNameStd );
286 if ( ItemMap.contains ( SuperClassName ) )
291 ItemMap[SuperClassName],
292 arrow_count[*SuperClassNameStd],
295 ItemMap[ClassName]->AddArrow ( NewArrow );
296 ItemMap[SuperClassName]->AddArrow ( NewArrow );
297 addItem ( NewArrow );
299 NewArrow->setZValue ( -1000.0 );
301 arrow_count[*SuperClassNameStd]++;
352 if ( itemAt ( mouseEvent->scenePos(), QTransform() ) ) {
355 m_mouse_item_pos = itemAt(mouseEvent->scenePos(), QTransform())->pos();
357 if ( mouseEvent->button() != Qt::LeftButton )
362 if ( mouseEvent->widget()->cursor().shape() == Qt::CrossCursor )
364 m_line =
new QGraphicsLineItem ( QLineF ( mouseEvent->scenePos(), mouseEvent->scenePos() ) );
365 m_line->setPen ( QPen ( Qt::black, 2 ) );
371 QGraphicsScene::mousePressEvent ( mouseEvent );
401 if ( itemAt ( mouseEvent->scenePos(), QTransform() ) ) {
402 auto item = itemAt(mouseEvent->scenePos(), QTransform() );
403 if (!m_mouse_item_pos.isNull()) {
404 modified(m_mouse_item_pos != item->pos());
405 m_mouse_item_pos = QPointF();
408 if ( m_line !=
nullptr )
410 QList<QGraphicsItem *> startItems = items ( m_line->line().p1() );
412 if ( startItems.count() && startItems.first() == m_line )
414 startItems.removeFirst();
417 QList<QGraphicsItem *> endItems = items ( m_line->line().p2() );
419 if ( endItems.count() && endItems.first() == m_line )
421 endItems.removeFirst();
424 RemoveItemFromScene ( m_line );
427 if ( startItems.count() > 0 && endItems.count() > 0
428 && startItems.first() != endItems.first() )
433 startItems.first() );
448 newArrow->setZValue ( -1000.0 );
449 addItem ( newArrow );
457 connect ( Editor, SIGNAL ( MakeGraphConnection ( QString, QString, QString ) ),
this,
458 SLOT ( DrawArrow ( QString, QString, QString ) ) );
465 QGraphicsScene::mouseReleaseEvent ( mouseEvent );
564 QString class_name = QString::fromStdString ( CurrentObject->GetClass()->get_name() );
567 QStringList super_class_list;
568 QList<QPointF> positions;
571 if(direct_classes !=
nullptr) {
572 for(std::string * cl_name : *direct_classes) {
573 super_class_list.push_back(QString::fromStdString(*cl_name));
574 positions.push_back({0,0});
578 this->AddItemsToScene ( super_class_list, positions );
625 QString class_name = QString::fromStdString ( CurrentObject->GetClass()->get_name() );
628 QStringList relationship_classes;
629 QList<QPointF> positions;
631 const std::list<OksRelationship *> * direct_relationship_list = class_info->
direct_relationships();
632 if ( direct_relationship_list !=
nullptr ) {
634 relationship_classes.push_back(QString::fromStdString(rl->get_type()));
635 positions.push_back({0,0});
640 this->AddItemsToScene ( relationship_classes, positions );
646 QString class_name = QString::fromStdString ( CurrentObject->GetClass()->get_name() );
649 QStringList relationship_classes;
650 QList<QPointF> positions;
652 const std::list<OksRelationship *> * all_relationship_list = class_info->
all_relationships();
653 if ( all_relationship_list !=
nullptr ) {
655 relationship_classes.push_back(QString::fromStdString(rl->get_type()));
656 positions.push_back({0,0});
661 this->AddItemsToScene ( relationship_classes, positions );
685 QString RelationshipName )
687 if ( !ItemMap.contains ( ClassName ) || !ItemMap.contains ( RelationshipType ) )
697 RelationshipName.toStdString() );
699 if ( SchemaRelationship !=
nullptr )
701 QString RelationshipCardinality =
707 QString::fromStdString ( SchemaRelationship->
get_name() ), RelationshipCardinality );
710 newArrow->setZValue ( -1000.0 );
711 addItem ( newArrow );