61 auto text = m_class_info->get_name();
62 auto desc = m_class_info->get_description();
66 text +=
"\n-----------";
68 std::string attr_descriptions;
69 auto attributes = m_class_info->direct_attributes();
70 if (attributes !=
nullptr) {
71 for (
auto attr: *attributes) {
72 if (!attr->get_description().empty()) {
73 attr_descriptions +=
"\n " + attr->get_name() +
": " +
74 attr->get_description();
78 std::string rel_descriptions;
79 auto relationships = m_class_info->direct_relationships();
80 if (relationships !=
nullptr) {
81 for (
auto rel: *relationships) {
82 if (!rel->get_description().empty()) {
83 rel_descriptions +=
"\n " + rel->get_name() +
": " +
84 rel->get_description();
88 std::string method_descriptions;
89 auto methods = m_class_info->direct_methods();
90 if (methods !=
nullptr) {
91 for (
auto method: *methods) {
92 if (!method->get_description().empty()) {
93 method_descriptions +=
"\n " + method->get_name() +
": " +
94 method->get_description();
99 std::string sep=
"\n-----";
100 if (!attr_descriptions.empty()) {
101 text +=
"\nAttributes:" + attr_descriptions;
102 if (!(rel_descriptions.empty() && method_descriptions.empty())) {
106 if (!rel_descriptions.empty()) {
107 text +=
"\nRelationships:" + rel_descriptions;
108 if (!method_descriptions.empty()) {
112 if (method_descriptions !=
"") {
113 text +=
"\nMethods:" + method_descriptions;
116 QToolTip::showText( he->screenPos(),
117 QString::fromStdString(text),
118 nullptr, QRect(), 10000);
144 m_class_attributes.clear();
145 m_class_relationhips.clear();
146 m_class_methods.clear();
148 std::list<OksAttribute *> direct_attributes = {};
149 if (m_class_info->direct_attributes()) {
150 direct_attributes = *m_class_info->direct_attributes();
152 std::list<OksMethod *> direct_methods = {};
153 if (m_class_info->direct_methods()) direct_methods = *m_class_info->
direct_methods();
155 std::list<OksRelationship *> direct_relationships = {};
156 if (m_class_info->direct_relationships()) direct_relationships = *m_class_info->direct_relationships();
158 std::list<OksAttribute *> all_attributes = {};
159 if (m_class_info->all_attributes()) all_attributes = *m_class_info->all_attributes();
161 std::list<OksMethod *> all_methods = {};
162 if (m_class_info->all_methods()) all_methods = *m_class_info->all_methods();
164 std::list<OksRelationship *> all_relationships = {};
165 if (m_class_info->all_relationships()) all_relationships = *m_class_info->all_relationships();
168 std::list<OksAttribute *> indirect_attributes = all_attributes;
169 std::list<OksMethod *> indirect_methods = all_methods;
170 std::list<OksRelationship *> indirect_relationships = all_relationships;
173 indirect_attributes.remove(attribute);
176 for (
OksMethod * method : direct_methods ) {
177 indirect_methods.remove(method);
181 indirect_relationships.remove(relationship);
184 std::map<OksRelationship::CardinalityConstraint, std::string> m = {
193 QString AttributeString (
194 QString::fromStdString ( attribute->get_name() ) +
" : "
195 + QString::fromStdString ( attribute->get_type() ) + (attribute->get_is_multi_values() ?
"[]" :
"") );
196 m_class_attributes.append ( AttributeString );
199 if (!attribute->get_init_value().empty()) {
200 value = QString::fromStdString (
" = " + attribute->get_init_value());
202 m_class_attribute_values.append (value);
208 QString relationship_string ( QString::fromStdString ( relationship->get_name() ) +
" : "
209 + QString::fromStdString ( relationship->get_type() ) +
" - "
210 + QString::fromStdString ( m[ relationship->get_low_cardinality_constraint() ] ) +
":"
211 + QString::fromStdString ( m[ relationship->get_high_cardinality_constraint() ] ) );
212 m_class_relationhips.append ( relationship_string );
216 for (
OksMethod * Method : direct_methods )
218 QString MethodString ( QString::fromStdString ( Method->get_name() ) +
"()" );
219 m_class_methods.append ( MethodString );
225 QString attribute_string (
226 QString::fromStdString ( attribute->get_name() ) +
" : "
227 + QString::fromStdString ( attribute->get_type() ) );
228 m_class_inherited_attributes.append ( attribute_string );
234 QString relationship_string ( QString::fromStdString ( relationship->get_name() ) +
" : "
235 + QString::fromStdString ( relationship->get_type() ) +
" - "
236 + QString::fromStdString ( m[ relationship->get_low_cardinality_constraint() ] ) +
":"
237 + QString::fromStdString ( m[ relationship->get_high_cardinality_constraint() ] ) );
238 m_class_inherited_relationhips.append ( relationship_string );
242 for (
OksMethod * method : indirect_methods )
244 QString method_string ( QString::fromStdString ( method->get_name() ) +
"()" );
245 m_class_inherited_methods.append ( method_string );
252 double TotalBoundingHeight = 0;
253 double TotalBoundingWidth = 0;
255 QFontMetrics FontMetrics ( m_font );
257 TotalBoundingHeight += SpaceX * 5;
258 TotalBoundingHeight += FontMetrics.boundingRect ( m_class_object_name ).height();
259 TotalBoundingWidth += FontMetrics.boundingRect ( m_class_object_name ).width();
262 for (
int entry=0; entry<m_class_attributes.size(); entry++)
264 QString attribute_name = m_class_attributes[entry];
265 if (m_scene->show_defaults()) {
266 attribute_name.append(m_class_attribute_values[entry]);
268 TotalBoundingHeight += FontMetrics.boundingRect ( attribute_name ).height();
270 if ( FontMetrics.boundingRect (attribute_name).width() > TotalBoundingWidth )
273 FontMetrics.boundingRect (attribute_name).width();
277 if (m_scene->inherited_properties_visible()) {
278 for (
auto & AttributeName : m_class_inherited_attributes )
280 TotalBoundingHeight += FontMetrics.boundingRect ( AttributeName ).height();
282 if ( FontMetrics.boundingRect ( AttributeName ).width() > TotalBoundingWidth )
284 FontMetrics.boundingRect ( AttributeName ).width();
288 for (
auto & relationship_name : m_class_relationhips )
290 TotalBoundingHeight += FontMetrics.boundingRect ( relationship_name ).height();
292 if ( FontMetrics.boundingRect ( relationship_name ).width() > TotalBoundingWidth )
294 FontMetrics.boundingRect ( relationship_name ).width();
297 if (m_scene->inherited_properties_visible()) {
298 for (
auto & relationship_name : m_class_inherited_relationhips )
300 TotalBoundingHeight += FontMetrics.boundingRect ( relationship_name ).height();
302 if ( FontMetrics.boundingRect ( relationship_name ).width() > TotalBoundingWidth )
304 FontMetrics.boundingRect ( relationship_name ).width();
308 for (
auto & MethodName : m_class_methods )
310 TotalBoundingHeight += FontMetrics.boundingRect ( MethodName ).height();
312 if ( FontMetrics.boundingRect ( MethodName ).width() > TotalBoundingWidth )
314 FontMetrics.boundingRect ( MethodName ).width();
317 if (m_scene->inherited_properties_visible()) {
318 for (
auto & MethodName : m_class_inherited_methods )
320 TotalBoundingHeight += FontMetrics.boundingRect ( MethodName ).height();
322 if ( FontMetrics.boundingRect ( MethodName ).width() > TotalBoundingWidth )
324 FontMetrics.boundingRect ( MethodName ).width();
328 TotalBoundingWidth += 15;
329 return QRectF ( 0, 0, TotalBoundingWidth, TotalBoundingHeight );
340 const QStyleOptionGraphicsItem * option,
352 if (m_highlight_class) {
356 else if (m_scene->highlight_active() &&
357 (m_class_info->get_file()->get_full_file_name()
369 const QPen bounding_box_pen = QPen(colour, 2.5);
370 const QPen inner_line_pen = QPen(colour, 1.5);
372 painter->setFont ( m_font );
373 painter->setPen ( bounding_box_pen );
374 painter->setBackground(background);
376 painter->drawRect ( boundingRect() );
378 const QFontMetrics FontMetrics = painter->fontMetrics();
379 const QRectF ClassNameBoundingRect = FontMetrics.boundingRect ( m_class_object_name );
380 const QRectF ObjectBoundingRect = boundingRect();
382 double HeightOffset = ClassNameBoundingRect.height() + SpaceY;
383 const auto ClassNamePosition = QPointF(
384 (ObjectBoundingRect.width() - ClassNameBoundingRect.width() ) / 2,
385 ClassNameBoundingRect.height());
386 painter->drawText ( ClassNamePosition, m_class_object_name );
387 painter->drawLine ( 0, HeightOffset, ObjectBoundingRect.width(), HeightOffset );
389 for (
int entry=0; entry<m_class_attributes.size(); entry++)
391 QString attribute_name = m_class_attributes[entry];
392 if (m_scene->show_defaults()) {
393 attribute_name.append(m_class_attribute_values[entry]);
395 const QRectF AttributeBoundingRect = FontMetrics.boundingRect (attribute_name);
396 HeightOffset += AttributeBoundingRect.height();
397 painter->drawText ( QPointF(SpaceX, HeightOffset), attribute_name );
400 if (m_scene->inherited_properties_visible()) {
402 for ( QString & AttributeName : m_class_inherited_attributes )
404 const QRectF AttributeBoundingRect = FontMetrics.boundingRect ( AttributeName );
405 HeightOffset += AttributeBoundingRect.height();
406 painter->drawText ( QPointF(SpaceX, HeightOffset), AttributeName );
408 painter->setPen ( colour );
411 HeightOffset += SpaceY;
412 painter->setPen ( inner_line_pen );
413 painter->drawLine ( 0, HeightOffset, ObjectBoundingRect.width(), HeightOffset );
415 for (
const QString & relationship_name : m_class_relationhips )
417 const QRectF relationship_bounding_rect = FontMetrics.boundingRect ( relationship_name );
418 HeightOffset += relationship_bounding_rect.height();
419 painter->drawText ( QPointF(SpaceX, HeightOffset), relationship_name );
422 if (m_scene->inherited_properties_visible()) {
424 for (
const QString & relationship_name : m_class_inherited_relationhips )
426 const QRectF relationship_bounding_rect = FontMetrics.boundingRect ( relationship_name );
427 HeightOffset += relationship_bounding_rect.height();
428 painter->drawText ( QPointF(SpaceX, HeightOffset), relationship_name );
430 painter->setPen ( colour );
434 HeightOffset += SpaceY;
435 painter->setPen ( inner_line_pen );
436 painter->drawLine ( 0, HeightOffset, ObjectBoundingRect.width(), HeightOffset );
438 for (
const QString & MethodName : m_class_methods )
440 const QRectF AttributeBoundingRect = FontMetrics.boundingRect ( MethodName );
441 HeightOffset += AttributeBoundingRect.height();
442 painter->drawText ( QPointF(SpaceX, HeightOffset), MethodName );
445 if (m_scene->inherited_properties_visible()) {
447 for (
const QString & MethodName : m_class_inherited_methods )
449 const QRectF AttributeBoundingRect = FontMetrics.boundingRect ( MethodName );
450 HeightOffset += AttributeBoundingRect.height();
451 painter->drawText (QPointF(SpaceX, HeightOffset), MethodName );
453 painter->setPen ( colour );