|
614 | 614 | ;; the understanding is that Rect will be the complete dc for a legend outside the plot-area |
615 | 615 | ;; and the plot-area otherwise |
616 | 616 |
|
617 | | - (: calculate-legend-parameters (-> (Listof legend-entry) Rect Anchor |
| 617 | + (: calculate-legend-parameters (-> (Listof legend-entry) |
| 618 | + Rect |
| 619 | + Anchor |
| 620 | + (U Nonnegative-Real |
| 621 | + (List Nonnegative-Real Nonnegative-Real Nonnegative-Real Nonnegative-Real)) |
| 622 | + |
618 | 623 | (Values Rect (Listof Exact-Rational) |
619 | 624 | Nonnegative-Exact-Rational (Listof Real) (Listof Real) |
620 | 625 | Nonnegative-Exact-Rational (Listof Real) |
621 | 626 | Boolean Nonnegative-Integer))) |
622 | | - (define/private (calculate-legend-parameters legend-entries rect legend-anchor) |
| 627 | + (define/private (calculate-legend-parameters legend-entries rect anchor padding) |
623 | 628 | (define n (length legend-entries)) |
624 | 629 | (define labels (map legend-entry-label legend-entries)) |
625 | 630 | (match-define (vector (ivl x-min x-max) (ivl y-min y-max)) rect) |
|
692 | 697 |
|
693 | 698 | ;; top-left corner of legend |
694 | 699 | (define legend-x-min |
695 | | - (case legend-anchor |
| 700 | + (case anchor |
696 | 701 | [(top-left left bottom-left auto) x-min] |
697 | 702 | [(top-right right bottom-right) (- x-max legend-x-size)] |
698 | 703 | [(center bottom top) (- (* 1/2 (+ x-min x-max)) |
699 | 704 | (* 1/2 legend-x-size))])) |
700 | 705 |
|
701 | 706 | (define legend-y-min |
702 | | - (case legend-anchor |
| 707 | + (case anchor |
703 | 708 | [(top-left top top-right auto) y-min] |
704 | 709 | [(bottom-left bottom bottom-right) (- y-max legend-y-size)] |
705 | 710 | [(center left right) (- (* 1/2 (+ y-min y-max)) |
706 | 711 | (* 1/2 legend-y-size))])) |
707 | 712 |
|
708 | | - (define legend-rect (vector (ivl legend-x-min (+ legend-x-min legend-x-size)) |
709 | | - (ivl legend-y-min (+ legend-y-min legend-y-size)))) |
| 713 | + (define legend-rect |
| 714 | + (let-values ([(pad-left pad-right pad-top pad-bottom) |
| 715 | + (if (list? padding) |
| 716 | + (values (list-ref padding 0) (list-ref padding 1) (list-ref padding 2) (list-ref padding 3)) |
| 717 | + (values padding padding padding padding))]) |
| 718 | + (vector (ivl (- legend-x-min pad-left) |
| 719 | + (+ legend-x-min legend-x-size pad-right)) |
| 720 | + (ivl (- legend-y-min pad-top) |
| 721 | + (+ legend-y-min legend-y-size pad-bottom))))) |
710 | 722 |
|
711 | 723 | ;; per entry x/y left/top corners |
712 | 724 | (define label-x-mins (for/fold ([mins : (Listof Real) (list (+ legend-x-min horiz-gap))] |
|
732 | 744 | [else |
733 | 745 | (raise-argument-error 'draw-legend "rect-known?" 1 legend-entries rect)])) |
734 | 746 |
|
735 | | - (define/public (calculate-legend-rect legend-entries rect legend-anchor) |
| 747 | + (define/public (calculate-legend-rect legend-entries rect anchor padding) |
736 | 748 | ;; Change font for correct size calculation in calculate-legend-parameters |
737 | 749 | (define old-size (send (send dc get-font) get-point-size)) |
738 | 750 | (define old-face (send (send dc get-font) get-face)) |
|
746 | 758 | draw-x-size label-x-mins draw-x-mins |
747 | 759 | draw-y-size label-y-mins |
748 | 760 | cols? div) |
749 | | - (calculate-legend-parameters legend-entries rect legend-anchor)) |
| 761 | + (calculate-legend-parameters legend-entries rect anchor padding)) |
750 | 762 |
|
751 | 763 | ;; Undo change font |
752 | 764 | (set-font-attribs old-size old-face old-family) |
|
755 | 767 |
|
756 | 768 | (define/public (draw-legend legend-entries rect) |
757 | 769 | (define legend-anchor (plot-legend-anchor)) |
| 770 | + (define legend-padding (plot-legend-padding)) |
758 | 771 | (when (not (eq? legend-anchor 'no-legend)) |
759 | 772 | (match-define (list (legend-entry #{labels : (Listof (U String pict))} |
760 | 773 | #{draw-procs : (Listof Legend-Draw-Proc)}) |
|
774 | 787 | draw-x-size label-x-mins draw-x-mins |
775 | 788 | draw-y-size label-y-mins |
776 | 789 | cols? div) |
777 | | - (calculate-legend-parameters legend-entries rect (legend-anchor->anchor legend-anchor))) |
| 790 | + (calculate-legend-parameters legend-entries rect (legend-anchor->anchor legend-anchor) legend-padding)) |
778 | 791 |
|
779 | 792 | ;; legend background |
780 | 793 | (set-pen (plot-foreground) 1 'transparent) |
|
0 commit comments