##// END OF EJS Templates
split legend layout to vertical and horizontal functions
sauimone -
r810:c712716bc681
parent child
Show More
@@ -106,6 +106,7 void BarChartItem::dataChanged()
106 106 }
107 107 }
108 108 }
109
109 110 QVector<QRectF> BarChartItem::calculateLayout()
110 111 {
111 112 QVector<QRectF> layout;
@@ -507,132 +507,159 void QLegend::updateLayout()
507 507 return;
508 508 }
509 509
510 // Find out widest item.
511 QSizeF markerMaxSize = maximumMarkerSize();
512 510 checkFirstMarkerBounds();
513 511
514 // Use max height as scroll button size
515 rescaleScrollButtons(QSize(markerMaxSize.height() ,markerMaxSize.height()));
516
517 qreal totalWidth = 0;
518 qreal totalHeight = 0;
519 512 switch (m_alignment)
520 513 {
521 514 // Both cases organise items horizontally
522 515 case QLegend::AlignmentBottom:
523 516 case QLegend::AlignmentTop: {
517 layoutHorizontal();
518 break;
519 }
520 // Both cases organize items vertically
521 case QLegend::AlignmentLeft:
522 case QLegend::AlignmentRight: {
523 layoutVertical();
524 break;
525 }
526 default: {
527 break;
528 }
529 }
524 530
525 qreal xStep = markerMaxSize.width();
526 qreal x = m_pos.x() + m_margin;
527 qreal y = m_pos.y() + m_margin;
528 int column = 0;
529 int maxColumns = 1;
530 qreal scrollButtonWidth = 0;
531 }
531 532
532 // Set correct visibility for scroll scrollbuttons
533 if (scrollButtonsVisible()) {
534 m_scrollButtonLeft->setVisible(true);
535 m_scrollButtonRight->setVisible(true);
536 // scrollbuttons visible, so add their width to total width
537 totalWidth += (m_scrollButtonLeft->boundingRect().width() + m_margin) * 2;
538 scrollButtonWidth = m_scrollButtonLeft->boundingRect().width() + m_margin;
539 // start position changes by scrollbutton width
540 x += scrollButtonWidth;
541 } else {
542 m_scrollButtonLeft->setVisible(false);
543 m_scrollButtonRight->setVisible(false);
544 }
545 m_scrollButtonUp->setVisible(false);
546 m_scrollButtonDown->setVisible(false);
533 /*!
534 \internal Organizes markers horizontally.
535 Causes legend to be resized.
536 */
537 void QLegend::layoutHorizontal()
538 {
539 // Find out widest item.
540 QSizeF markerMaxSize = maximumMarkerSize();
541 // Use max height as scroll button size
542 rescaleScrollButtons(QSize(markerMaxSize.height() ,markerMaxSize.height()));
543
544 qreal totalWidth = 0;
545 qreal totalHeight = 0;
546
547 qreal xStep = markerMaxSize.width();
548 qreal x = m_pos.x() + m_margin;
549 qreal y = m_pos.y() + m_margin;
550 int column = 0;
551 int maxColumns = 1;
552 qreal scrollButtonWidth = 0;
553
554 // Set correct visibility for scroll scrollbuttons
555 if (scrollButtonsVisible()) {
556 m_scrollButtonLeft->setVisible(true);
557 m_scrollButtonRight->setVisible(true);
558 // scrollbuttons visible, so add their width to total width
559 totalWidth += (m_scrollButtonLeft->boundingRect().width() + m_margin) * 2;
560 scrollButtonWidth = m_scrollButtonLeft->boundingRect().width() + m_margin;
561 // start position changes by scrollbutton width
562 x += scrollButtonWidth;
563 } else {
564 m_scrollButtonLeft->setVisible(false);
565 m_scrollButtonRight->setVisible(false);
566 }
567 m_scrollButtonUp->setVisible(false);
568 m_scrollButtonDown->setVisible(false);
547 569
548 for (int i=0; i < m_markers.count(); i++) {
549 LegendMarker *m = m_markers.at(i);
550 if (i < mFirstMarker) {
551 // Markers before first are not visible.
570 for (int i=0; i < m_markers.count(); i++) {
571 LegendMarker *m = m_markers.at(i);
572 if (i < mFirstMarker) {
573 // Markers before first are not visible.
574 m->setVisible(false);
575 } else {
576 if ((x + xStep + scrollButtonWidth + m_margin) > (m_pos.x() + m_maximumSize.width())) {
577 // This marker would go outside legend rect.
552 578 m->setVisible(false);
553 579 } else {
554 if ((x + xStep + scrollButtonWidth + m_margin) > (m_pos.x() + m_maximumSize.width())) {
555 // This marker would go outside legend rect.
556 m->setVisible(false);
557 } else {
558 // This marker is ok
559 m->setVisible(true);
560 m->setPos(x, y);
561 x += xStep;
562 column++;
563 }
580 // This marker is ok
581 m->setVisible(true);
582 m->setPos(x, y);
583 x += xStep;
584 column++;
564 585 }
565 maxColumns = column;
566 586 }
587 maxColumns = column;
588 }
567 589
568 m_scrollButtonLeft->setPos(m_pos.x() + m_margin, y);
569 m_scrollButtonRight->setPos(x + m_margin, y);
590 m_scrollButtonLeft->setPos(m_pos.x() + m_margin, y);
591 m_scrollButtonRight->setPos(x + m_margin, y);
570 592
571 totalWidth += maxColumns * markerMaxSize.width() + m_margin * 2;
572 totalHeight = markerMaxSize.height() + m_margin * 2;
593 totalWidth += maxColumns * markerMaxSize.width() + m_margin * 2;
594 totalHeight = markerMaxSize.height() + m_margin * 2;
573 595
574 break;
596 m_size.setWidth(totalWidth);
597 m_size.setHeight(totalHeight);
598 }
599
600 /*!
601 \internal Organizes markers vertically.
602 Causes legend to be resized.
603 */
604 void QLegend::layoutVertical()
605 {
606 // Find out widest item.
607 QSizeF markerMaxSize = maximumMarkerSize();
608 // Use max height as scroll button size
609 rescaleScrollButtons(QSize(markerMaxSize.height() ,markerMaxSize.height()));
610
611 qreal totalWidth = 0;
612 qreal totalHeight = 0;
613
614 qreal yStep = markerMaxSize.height();
615 qreal x = m_pos.x() + m_margin;
616 qreal y = m_pos.y() + m_margin;
617 int row = 1;
618 int maxRows = 1;
619 qreal scrollButtonHeight = 0;
620
621 // Set correct visibility for scroll scrollbuttons
622 if (scrollButtonsVisible()) {
623 m_scrollButtonUp->setVisible(true);
624 m_scrollButtonDown->setVisible(true);
625 totalHeight += (m_scrollButtonUp->boundingRect().height() + m_margin) * 2; // scrollbuttons visible, so add their height to total height
626 scrollButtonHeight = m_scrollButtonUp->boundingRect().height();
627 y += scrollButtonHeight + m_margin; // start position changes by scrollbutton height
628 } else {
629 m_scrollButtonUp->setVisible(false);
630 m_scrollButtonDown->setVisible(false);
575 631 }
576 // Both cases organize items vertically
577 case QLegend::AlignmentLeft:
578 case QLegend::AlignmentRight: {
579 qreal yStep = markerMaxSize.height();
580 qreal x = m_pos.x() + m_margin;
581 qreal y = m_pos.y() + m_margin;
582 int row = 1;
583 int maxRows = 1;
584 qreal scrollButtonHeight = 0;
585
586 // Set correct visibility for scroll scrollbuttons
587 if (scrollButtonsVisible()) {
588 m_scrollButtonUp->setVisible(true);
589 m_scrollButtonDown->setVisible(true);
590 totalHeight += (m_scrollButtonUp->boundingRect().height() + m_margin) * 2; // scrollbuttons visible, so add their height to total height
591 scrollButtonHeight = m_scrollButtonUp->boundingRect().height();
592 y += scrollButtonHeight + m_margin; // start position changes by scrollbutton height
593 } else {
594 m_scrollButtonUp->setVisible(false);
595 m_scrollButtonDown->setVisible(false);
596 }
597 m_scrollButtonLeft->setVisible(false);
598 m_scrollButtonRight->setVisible(false);
632 m_scrollButtonLeft->setVisible(false);
633 m_scrollButtonRight->setVisible(false);
599 634
600 for (int i=0; i < m_markers.count(); i++) {
601 LegendMarker* m = m_markers.at(i);
602 if (i < mFirstMarker) {
603 // Markers before first are not visible.
635 for (int i=0; i < m_markers.count(); i++) {
636 LegendMarker* m = m_markers.at(i);
637 if (i < mFirstMarker) {
638 // Markers before first are not visible.
639 m->setVisible(false);
640 } else {
641 if ((y + yStep + scrollButtonHeight) > (m_pos.y() + m_maximumSize.height())) {
642 // This marker would go outside legend rect.
604 643 m->setVisible(false);
605 644 } else {
606 if ((y + yStep + scrollButtonHeight) > (m_pos.y() + m_maximumSize.height())) {
607 // This marker would go outside legend rect.
608 m->setVisible(false);
609 } else {
610 // This marker is ok
611 m->setVisible(true);
612 m->setPos(x, y);
613 y += yStep;
614 row++;
615 }
645 // This marker is ok
646 m->setVisible(true);
647 m->setPos(x, y);
648 y += yStep;
649 row++;
616 650 }
617 maxRows = row;
618 651 }
652 maxRows = row;
653 }
619 654
620 m_scrollButtonUp->setPos(m_pos.x() + m_margin, m_pos.y() + m_margin);
621 m_scrollButtonDown->setPos(m_pos.x() + m_margin, y + m_margin);
655 m_scrollButtonUp->setPos(m_pos.x() + m_margin, m_pos.y() + m_margin);
656 m_scrollButtonDown->setPos(m_pos.x() + m_margin, y + m_margin);
622 657
623 totalWidth += markerMaxSize.width() + m_margin * 2;
624 totalHeight = maxRows * markerMaxSize.height() + m_margin * 4 + scrollButtonHeight; // TODO: check this
625 break;
626 }
627 default: {
628 break;
629 }
630 }
658 totalWidth += markerMaxSize.width() + m_margin * 2;
659 totalHeight = maxRows * markerMaxSize.height() + m_margin * 4 + scrollButtonHeight; // TODO: check this
631 660
632 661 m_size.setWidth(totalWidth);
633 662 m_size.setHeight(totalHeight);
634
635 update();
636 663 }
637 664
638 665 /*!
@@ -109,6 +109,8 private:
109 109 void appendMarkers(QPieSeries *series);
110 110 void deleteMarkers(QSeries *series);
111 111 void updateLayout();
112 void layoutHorizontal();
113 void layoutVertical();
112 114 void rescaleScrollButtons(const QSize &size);
113 115 QSizeF maximumMarkerSize();
114 116 void checkFirstMarkerBounds();
General Comments 0
You need to be logged in to leave comments. Login now