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_abstract(false),
29 m_highlight_active(false),
33 setSceneRect ( QRectF ( 0, 0, 10000, 10000 ) );
43 m_add_class =
new QAction (
"&Add new class",
this );
44 connect ( m_add_class, SIGNAL ( triggered() ),
this, SLOT ( new_class_slot() ) );
47 m_edit_class =
new QAction (
"&Edit class",
this );
48 connect ( m_edit_class, SIGNAL ( triggered() ),
this, SLOT ( EditClassSlot() ) );
51 m_toggle_indirect_infos =
new QAction (
"Toggle &inherited properties",
this );
52 connect ( m_toggle_indirect_infos, SIGNAL ( triggered() ),
this, SLOT ( ToggleIndirectInfos() ) );
55 m_toggle_highlight_active =
new QAction (
"Toggle &highlighting of classes in active schema",
this );
56 connect ( m_toggle_highlight_active, SIGNAL ( triggered() ),
this, SLOT ( ToggleHighlightActive() ) );
59 m_toggle_highlight_abstract =
new QAction (
"Toggle &highlighting of abstract classes in view",
this );
60 connect ( m_toggle_highlight_abstract, SIGNAL ( triggered() ),
this, SLOT ( ToggleHighlightAbstract() ) );
63 m_toggle_default =
new QAction (
"Toggle showing of &default values of attributes",
this );
64 connect ( m_toggle_default, SIGNAL ( triggered() ),
this, SLOT ( ToggleDefault() ) );
67 m_toggle_highlight_class =
new QAction (
"Toggle &highlighting of this class",
this );
68 connect ( m_toggle_highlight_class, SIGNAL ( triggered() ),
this, SLOT ( ToggleHighlightClass() ) );
70 m_add_note =
new QAction (
"&Add note to view",
this );
71 connect ( m_add_note, SIGNAL ( triggered() ),
this, SLOT ( new_note_slot() ) );
73 m_edit_note =
new QAction (
"&Edit note",
this );
74 connect ( m_edit_note, SIGNAL ( triggered() ),
this, SLOT ( edit_note_slot() ) );
76 m_remove_note =
new QAction (
"&Remove note",
this );
77 connect ( m_remove_note, SIGNAL ( triggered() ),
this, SLOT ( remove_note_slot() ) );
80 m_add_direct_super_classes =
new QAction (
"Add direct &superclasses to view",
this );
81 connect ( m_add_direct_super_classes, SIGNAL ( triggered() ),
this, SLOT ( AddDirectSuperClassesSlot() ) );
84 m_add_direct_relationship_classes =
new QAction (
"Add direct &relationship classes to view",
this );
85 connect ( m_add_direct_relationship_classes, SIGNAL ( triggered() ),
this, SLOT ( AddDirectRelationshipClassesSlot() ) );
88 m_add_all_super_classes =
new QAction (
"Add all &superclasses to view",
this );
89 connect ( m_add_all_super_classes, SIGNAL ( triggered() ),
this, SLOT ( AddAllSuperClassesSlot() ) );
92 m_add_all_sub_classes =
new QAction (
"Add all s&ubclasses to view",
this );
93 connect ( m_add_all_sub_classes, SIGNAL ( triggered() ),
this, SLOT ( AddAllSubClassesSlot() ) );
96 m_add_all_relationship_classes =
new QAction (
"Add all &relationship classes to view",
this );
97 connect ( m_add_all_relationship_classes, SIGNAL ( triggered() ),
this, SLOT ( AddAllRelationshipClassesSlot() ) );
100 m_remove_class =
new QAction (
"&Remove Class from view",
this );
101 connect ( m_remove_class, SIGNAL ( triggered() ),
this, SLOT ( RemoveClassSlot() ) );
104 m_remove_arrow =
new QAction (
"&Remove Arrow",
this );
105 connect ( m_remove_arrow, SIGNAL ( triggered() ),
this, SLOT ( RemoveArrowSlot() ) );
152 if ( m_context_menu ==
nullptr ) {
153 m_context_menu =
new QMenu();
154 m_context_menu->addAction ( m_add_class );
155 m_context_menu->addAction ( m_add_note );
156 m_context_menu->addAction ( m_toggle_indirect_infos );
157 m_context_menu->addAction ( m_toggle_highlight_abstract );
158 m_context_menu->addAction ( m_toggle_highlight_active );
159 m_context_menu->addAction ( m_toggle_default );
161 m_seperator_pos = m_context_menu->actions().size();
162 m_context_menu->addSeparator();
164 m_class_pos = m_context_menu->actions().size();
165 m_context_menu->addAction ( m_edit_class );
166 m_context_menu->addAction ( m_remove_class );
167 m_context_menu->addAction ( m_toggle_highlight_class );
168 m_context_menu->addAction ( m_add_direct_super_classes );
169 m_context_menu->addAction ( m_add_direct_relationship_classes );
170 m_context_menu->addAction ( m_add_all_super_classes );
171 m_context_menu->addAction ( m_add_all_sub_classes );
172 m_context_menu->addAction ( m_add_all_sub_classes );
173 m_context_menu->addAction ( m_add_all_relationship_classes );
175 m_arrow_pos = m_context_menu->actions().size();
176 m_context_menu->addAction ( m_remove_arrow );
178 m_note_pos = m_context_menu->actions().size();
179 m_context_menu->addAction ( m_edit_note );
180 m_context_menu->addAction ( m_remove_note );
184 m_context_menu->actions().at ( 0 )->setVisible ( active );
186 for (
int item=1; item<m_seperator_pos; item++) {
187 m_context_menu->actions().at ( item )->setVisible (
true );
191 const auto nitems = m_context_menu->actions().size();
192 for (
int item=m_seperator_pos; item<nitems; item++) {
193 m_context_menu->actions().at ( item )->setVisible (
false );
196 if ( itemAt ( event->scenePos(), QTransform() ) ) {
199 m_context_menu->actions().at ( m_seperator_pos )->setVisible (
true );
202 itemAt ( event->scenePos(), QTransform() ) );
204 itemAt ( event->scenePos(), QTransform() ) );
206 itemAt ( event->scenePos(), QTransform() ) );
208 if (
object !=
nullptr) {
209 CurrentObject = object;
211 CurrentObject->GetClass()->get_file()->get_full_file_name();
213 m_context_menu->actions().at ( m_class_pos )->setVisible ( writable );
215 for (
int item=m_class_pos+1; item<m_arrow_pos; item++) {
216 m_context_menu->actions().at ( item )->setVisible (
true );
219 else if ( arrow !=
nullptr ) {
220 m_context_menu->actions().at ( m_arrow_pos )->setVisible (
true );
221 m_current_arrow = arrow;
223 else if ( note !=
nullptr) {
224 for (
int item=m_note_pos; item<nitems; item++) {
225 m_context_menu->actions().at ( item )->setVisible (
true );
227 m_current_note = note;
230 m_current_pos =
event->scenePos();
231 m_context_menu->exec ( event->screenPos() );
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 =
283 ItemMap[ClassName], ItemMap[RelationshipClassType],
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 ) )
311 ItemMap[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]++;
421 if ( itemAt ( mouseEvent->scenePos(), QTransform() ) ) {
422 auto item = itemAt(mouseEvent->scenePos(), QTransform() );
423 if (!m_mouse_item_pos.isNull()) {
424 if (m_mouse_item_pos != item->pos()) {
427 m_mouse_item_pos = QPointF();
430 if ( m_line !=
nullptr )
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();
446 RemoveItemFromScene ( m_line );
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 );