62 auto text = m_class_info->get_name();
63 auto desc = m_class_info->get_description();
67 text +=
"\n-----------";
69 std::string attr_descriptions;
70 auto attributes = m_class_info->direct_attributes();
71 if (attributes !=
nullptr) {
72 for (
auto attr: *attributes) {
73 if (!attr->get_description().empty()) {
74 attr_descriptions +=
"\n " + attr->get_name() +
": " +
75 attr->get_description();
79 std::string rel_descriptions;
80 auto relationships = m_class_info->direct_relationships();
81 if (relationships !=
nullptr) {
82 for (
auto rel: *relationships) {
83 if (!rel->get_description().empty()) {
84 rel_descriptions +=
"\n " + rel->get_name() +
": " +
85 rel->get_description();
89 std::string method_descriptions;
90 auto methods = m_class_info->direct_methods();
91 if (methods !=
nullptr) {
92 for (
auto method: *methods) {
93 if (!method->get_description().empty()) {
94 method_descriptions +=
"\n " + method->get_name() +
": " +
95 method->get_description();
100 std::string sep=
"\n-----";
101 if (!attr_descriptions.empty()) {
102 text +=
"\nAttributes:" + attr_descriptions;
103 if (!(rel_descriptions.empty() && method_descriptions.empty())) {
107 if (!rel_descriptions.empty()) {
108 text +=
"\nRelationships:" + rel_descriptions;
109 if (!method_descriptions.empty()) {
113 if (method_descriptions !=
"") {
114 text +=
"\nMethods:" + method_descriptions;
117 QToolTip::showText( he->screenPos(),
118 QString::fromStdString(text),
119 nullptr, QRect(), 10000);
170 m_class_attributes.clear();
171 m_class_relationhips.clear();
172 m_class_methods.clear();
174 std::list<OksAttribute *> direct_attributes = {};
175 if (m_class_info->direct_attributes()) {
176 direct_attributes = *m_class_info->direct_attributes();
178 std::list<OksMethod *> direct_methods = {};
179 if (m_class_info->direct_methods()) direct_methods = *m_class_info->
direct_methods();
181 std::list<OksRelationship *> direct_relationships = {};
182 if (m_class_info->direct_relationships()) direct_relationships = *m_class_info->direct_relationships();
184 std::list<OksAttribute *> all_attributes = {};
185 if (m_class_info->all_attributes()) all_attributes = *m_class_info->all_attributes();
187 std::list<OksMethod *> all_methods = {};
188 if (m_class_info->all_methods()) all_methods = *m_class_info->all_methods();
190 std::list<OksRelationship *> all_relationships = {};
191 if (m_class_info->all_relationships()) all_relationships = *m_class_info->all_relationships();
194 std::list<OksAttribute *> indirect_attributes = all_attributes;
195 std::list<OksMethod *> indirect_methods = all_methods;
196 std::list<OksRelationship *> indirect_relationships = all_relationships;
199 indirect_attributes.remove(attribute);
202 for (
OksMethod * method : direct_methods ) {
203 indirect_methods.remove(method);
207 indirect_relationships.remove(relationship);
210 std::map<OksRelationship::CardinalityConstraint, std::string> m = {
219 QString AttributeString (
220 QString::fromStdString ( attribute->get_name() ) +
" : "
221 + QString::fromStdString ( attribute->get_type() ) + (attribute->get_is_multi_values() ?
"[]" :
"") );
222 m_class_attributes.append ( AttributeString );
228 QString relationship_string ( QString::fromStdString ( relationship->get_name() ) +
" : "
229 + QString::fromStdString ( relationship->get_type() ) +
" - "
230 + QString::fromStdString ( m[ relationship->get_low_cardinality_constraint() ] ) +
":"
231 + QString::fromStdString ( m[ relationship->get_high_cardinality_constraint() ] ) );
232 m_class_relationhips.append ( relationship_string );
236 for (
OksMethod * Method : direct_methods )
238 QString MethodString ( QString::fromStdString ( Method->get_name() ) +
"()" );
239 m_class_methods.append ( MethodString );
242 if (m_inherited_properties_visible) {
246 QString attribute_string (
247 QString::fromStdString ( attribute->get_name() ) +
" : "
248 + QString::fromStdString ( attribute->get_type() ) );
249 m_class_inherited_attributes.append ( attribute_string );
255 QString relationship_string ( QString::fromStdString ( relationship->get_name() ) +
" : "
256 + QString::fromStdString ( relationship->get_type() ) +
" - "
257 + QString::fromStdString ( m[ relationship->get_low_cardinality_constraint() ] ) +
":"
258 + QString::fromStdString ( m[ relationship->get_high_cardinality_constraint() ] ) );
259 m_class_inherited_relationhips.append ( relationship_string );
263 for (
OksMethod * method : indirect_methods )
265 QString method_string ( QString::fromStdString ( method->get_name() ) +
"()" );
266 m_class_inherited_methods.append ( method_string );
276 double TotalBoundingHeight = 0;
277 double TotalBoundingWidth = 0;
279 QFontMetrics FontMetrics ( m_font );
281 TotalBoundingHeight += SpaceX * 5;
282 TotalBoundingHeight += FontMetrics.boundingRect ( m_class_object_name ).height();
283 TotalBoundingWidth += FontMetrics.boundingRect ( m_class_object_name ).width();
285 for (
auto & AttributeName : m_class_attributes )
287 TotalBoundingHeight += FontMetrics.boundingRect ( AttributeName ).height();
289 if ( FontMetrics.boundingRect ( AttributeName ).width() > TotalBoundingWidth )
291 FontMetrics.boundingRect ( AttributeName ).width();
294 if (m_inherited_properties_visible) {
295 for (
auto & AttributeName : m_class_inherited_attributes )
297 TotalBoundingHeight += FontMetrics.boundingRect ( AttributeName ).height();
299 if ( FontMetrics.boundingRect ( AttributeName ).width() > TotalBoundingWidth )
301 FontMetrics.boundingRect ( AttributeName ).width();
305 for (
auto & relationship_name : m_class_relationhips )
307 TotalBoundingHeight += FontMetrics.boundingRect ( relationship_name ).height();
309 if ( FontMetrics.boundingRect ( relationship_name ).width() > TotalBoundingWidth )
311 FontMetrics.boundingRect ( relationship_name ).width();
314 if (m_inherited_properties_visible) {
315 for (
auto & relationship_name : m_class_inherited_relationhips )
317 TotalBoundingHeight += FontMetrics.boundingRect ( relationship_name ).height();
319 if ( FontMetrics.boundingRect ( relationship_name ).width() > TotalBoundingWidth )
321 FontMetrics.boundingRect ( relationship_name ).width();
325 for (
auto & MethodName : m_class_methods )
327 TotalBoundingHeight += FontMetrics.boundingRect ( MethodName ).height();
329 if ( FontMetrics.boundingRect ( MethodName ).width() > TotalBoundingWidth )
331 FontMetrics.boundingRect ( MethodName ).width();
334 if (m_inherited_properties_visible) {
335 for (
auto & MethodName : m_class_inherited_methods )
337 TotalBoundingHeight += FontMetrics.boundingRect ( MethodName ).height();
339 if ( FontMetrics.boundingRect ( MethodName ).width() > TotalBoundingWidth )
341 FontMetrics.boundingRect ( MethodName ).width();
345 TotalBoundingWidth += 15;
346 return QRectF ( 0, 0, TotalBoundingWidth, TotalBoundingHeight );
357 const QStyleOptionGraphicsItem * option,
367 if (m_highlight_active && (m_class_info->get_file()->get_full_file_name()
369 colour = m_highlight_color;
372 colour = m_default_color;
375 const QPen bounding_box_pen = QPen(colour, 2.5);
376 const QPen inner_line_pen = QPen(colour, 1.5);
378 painter->setFont ( m_font );
379 painter->setPen ( bounding_box_pen );
380 painter->drawRect ( boundingRect() );
383 QFontMetrics FontMetrics = painter->fontMetrics();
384 QRectF ClassNameBoundingRect = FontMetrics.boundingRect ( m_class_object_name );
385 QRectF ObjectBoundingRect = boundingRect();
387 double HeightOffset = ClassNameBoundingRect.height() + SpaceY;
388 int ClassNamePosition = ( ObjectBoundingRect.width() - ClassNameBoundingRect.width() ) / 2;
389 painter->setFont ( m_font );
390 painter->drawText ( ClassNamePosition, ClassNameBoundingRect.height(), m_class_object_name );
391 painter->setFont ( m_font );
392 painter->drawLine ( 0, HeightOffset, ObjectBoundingRect.width(), HeightOffset );
394 for ( QString & AttributeName : m_class_attributes )
396 QRectF AttributeBoundingRect = FontMetrics.boundingRect ( AttributeName );
397 HeightOffset += AttributeBoundingRect.height();
398 painter->drawText ( SpaceX, HeightOffset, AttributeName );
401 if (m_inherited_properties_visible) {
402 painter->setPen ( m_opaque_color );
403 for ( QString & AttributeName : m_class_inherited_attributes )
405 QRectF AttributeBoundingRect = FontMetrics.boundingRect ( AttributeName );
406 HeightOffset += AttributeBoundingRect.height();
407 painter->drawText ( SpaceX, HeightOffset, AttributeName );
409 painter->setPen ( colour );
412 HeightOffset += SpaceY;
413 painter->setPen ( inner_line_pen );
414 painter->drawLine ( 0, HeightOffset, ObjectBoundingRect.width(), HeightOffset );
416 for ( QString & relationship_name : m_class_relationhips )
418 QRectF relationship_bounding_rect = FontMetrics.boundingRect ( relationship_name );
419 HeightOffset += relationship_bounding_rect.height();
420 painter->drawText ( SpaceX, HeightOffset, relationship_name );
423 if (m_inherited_properties_visible) {
424 painter->setPen ( m_opaque_color );
425 for ( QString & relationship_name : m_class_inherited_relationhips )
427 QRectF relationship_bounding_rect = FontMetrics.boundingRect ( relationship_name );
428 HeightOffset += relationship_bounding_rect.height();
429 painter->drawText ( SpaceX, HeightOffset, relationship_name );
431 painter->setPen ( colour );
435 HeightOffset += SpaceY;
436 painter->setPen ( inner_line_pen );
437 painter->drawLine ( 0, HeightOffset, ObjectBoundingRect.width(), HeightOffset );
439 for ( QString & MethodName : m_class_methods )
441 QRectF AttributeBoundingRect = FontMetrics.boundingRect ( MethodName );
442 HeightOffset += AttributeBoundingRect.height();
443 painter->drawText ( SpaceX, HeightOffset, MethodName );
446 if (m_inherited_properties_visible) {
447 painter->setPen ( m_opaque_color );
448 for ( QString & MethodName : m_class_inherited_methods )
450 QRectF AttributeBoundingRect = FontMetrics.boundingRect ( MethodName );
451 HeightOffset += AttributeBoundingRect.height();
452 painter->drawText ( SpaceX, HeightOffset, MethodName );
454 painter->setPen ( colour );