Skip to content

Commit 8c199a1

Browse files
committed
adapt element definitions
1 parent 91302e0 commit 8c199a1

File tree

2 files changed

+98
-91
lines changed

2 files changed

+98
-91
lines changed

R/theme-elements.R

Lines changed: 95 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ element_grob.element_point <- function(element, x = 0.5, y = 0.5, colour = NULL,
483483
#' # plot panels. To do so, it registers a new theme element `ggxyz.panel.annotation`
484484
#' register_theme_elements(
485485
#' ggxyz.panel.annotation = element_text(color = "blue", hjust = 0.95, vjust = 0.05),
486-
#' element_tree = list(ggxyz.panel.annotation = el_def("element_text", "text"))
486+
#' element_tree = list(ggxyz.panel.annotation = el_def(element_text, "text"))
487487
#' )
488488
#'
489489
#' # Now the package can define a new coord that includes a panel annotation
@@ -602,8 +602,8 @@ check_element_tree <- function(x, arg = caller_arg(x), call = caller_env()) {
602602
#' @details
603603
#' The function `el_def()` is used to define new or modified element types and
604604
#' element inheritance relationships for the element tree.
605-
#' @param class The name of the element class. Examples are "element_line" or
606-
#' "element_text" or "unit", or one of the two reserved keywords "character" or
605+
#' @param class The name of the element class. Examples are `element_line` or
606+
#' `element_text` or "unit", or one of the two reserved keywords "character" or
607607
#' "margin". The reserved keyword "character" implies a character
608608
#' or numeric vector, not a class called "character". The keyword
609609
#' "margin" implies a unit vector of length 4, as created by [margin()].
@@ -622,43 +622,43 @@ el_def <- function(class = NULL, inherit = NULL, description = NULL) {
622622
# among them. It should not be read from directly, since users may modify the
623623
# current element tree stored in ggplot_global$element_tree
624624
.element_tree <- list(
625-
line = el_def("element_line"),
626-
rect = el_def("element_rect"),
627-
text = el_def("element_text"),
628-
point = el_def("element_point"),
629-
polygon = el_def("element_polygon"),
630-
geom = el_def("element_geom"),
631-
title = el_def("element_text", "text"),
625+
line = el_def(element_line),
626+
rect = el_def(element_rect),
627+
text = el_def(element_text),
628+
point = el_def(element_point),
629+
polygon = el_def(element_polygon),
630+
geom = el_def(element_geom),
631+
title = el_def(element_text, "text"),
632632
spacing = el_def("unit"),
633633
margins = el_def(c("margin", "unit")),
634634

635-
axis.line = el_def("element_line", "line"),
636-
axis.text = el_def("element_text", "text"),
637-
axis.title = el_def("element_text", "title"),
638-
axis.ticks = el_def("element_line", "line"),
635+
axis.line = el_def(element_line, "line"),
636+
axis.text = el_def(element_text, "text"),
637+
axis.title = el_def(element_text, "title"),
638+
axis.ticks = el_def(element_line, "line"),
639639
legend.key.size = el_def(c("unit", "rel"), "spacing"),
640-
panel.grid = el_def("element_line", "line"),
641-
panel.grid.major = el_def("element_line", "panel.grid"),
642-
panel.grid.minor = el_def("element_line", "panel.grid"),
643-
strip.text = el_def("element_text", "text"),
644-
645-
axis.line.x = el_def("element_line", "axis.line"),
646-
axis.line.x.top = el_def("element_line", "axis.line.x"),
647-
axis.line.x.bottom = el_def("element_line", "axis.line.x"),
648-
axis.line.y = el_def("element_line", "axis.line"),
649-
axis.line.y.left = el_def("element_line", "axis.line.y"),
650-
axis.line.y.right = el_def("element_line", "axis.line.y"),
651-
axis.line.theta = el_def("element_line", "axis.line.x"),
652-
axis.line.r = el_def("element_line", "axis.line.y"),
653-
654-
axis.text.x = el_def("element_text", "axis.text"),
655-
axis.text.x.top = el_def("element_text", "axis.text.x"),
656-
axis.text.x.bottom = el_def("element_text", "axis.text.x"),
657-
axis.text.y = el_def("element_text", "axis.text"),
658-
axis.text.y.left = el_def("element_text", "axis.text.y"),
659-
axis.text.y.right = el_def("element_text", "axis.text.y"),
660-
axis.text.theta = el_def("element_text", "axis.text.x"),
661-
axis.text.r = el_def("element_text", "axis.text.y"),
640+
panel.grid = el_def(element_line, "line"),
641+
panel.grid.major = el_def(element_line, "panel.grid"),
642+
panel.grid.minor = el_def(element_line, "panel.grid"),
643+
strip.text = el_def(element_text, "text"),
644+
645+
axis.line.x = el_def(element_line, "axis.line"),
646+
axis.line.x.top = el_def(element_line, "axis.line.x"),
647+
axis.line.x.bottom = el_def(element_line, "axis.line.x"),
648+
axis.line.y = el_def(element_line, "axis.line"),
649+
axis.line.y.left = el_def(element_line, "axis.line.y"),
650+
axis.line.y.right = el_def(element_line, "axis.line.y"),
651+
axis.line.theta = el_def(element_line, "axis.line.x"),
652+
axis.line.r = el_def(element_line, "axis.line.y"),
653+
654+
axis.text.x = el_def(element_text, "axis.text"),
655+
axis.text.x.top = el_def(element_text, "axis.text.x"),
656+
axis.text.x.bottom = el_def(element_text, "axis.text.x"),
657+
axis.text.y = el_def(element_text, "axis.text"),
658+
axis.text.y.left = el_def(element_text, "axis.text.y"),
659+
axis.text.y.right = el_def(element_text, "axis.text.y"),
660+
axis.text.theta = el_def(element_text, "axis.text.x"),
661+
axis.text.r = el_def(element_text, "axis.text.y"),
662662

663663
axis.ticks.length = el_def(c("unit", "rel"), "spacing"),
664664
axis.ticks.length.x = el_def(c("unit", "rel"), "axis.ticks.length"),
@@ -670,28 +670,28 @@ el_def <- function(class = NULL, inherit = NULL, description = NULL) {
670670
axis.ticks.length.theta = el_def(c("unit", "rel"), "axis.ticks.length.x"),
671671
axis.ticks.length.r = el_def(c("unit", "rel"), "axis.ticks.length.y"),
672672

673-
axis.ticks.x = el_def("element_line", "axis.ticks"),
674-
axis.ticks.x.top = el_def("element_line", "axis.ticks.x"),
675-
axis.ticks.x.bottom = el_def("element_line", "axis.ticks.x"),
676-
axis.ticks.y = el_def("element_line", "axis.ticks"),
677-
axis.ticks.y.left = el_def("element_line", "axis.ticks.y"),
678-
axis.ticks.y.right = el_def("element_line", "axis.ticks.y"),
679-
axis.ticks.theta = el_def("element_line", "axis.ticks.x"),
680-
axis.ticks.r = el_def("element_line", "axis.ticks.y"),
681-
682-
axis.title.x = el_def("element_text", "axis.title"),
683-
axis.title.x.top = el_def("element_text", "axis.title.x"),
684-
axis.title.x.bottom = el_def("element_text", "axis.title.x"),
685-
axis.title.y = el_def("element_text", "axis.title"),
686-
axis.title.y.left = el_def("element_text", "axis.title.y"),
687-
axis.title.y.right = el_def("element_text", "axis.title.y"),
688-
689-
axis.minor.ticks.x.top = el_def("element_line", "axis.ticks.x.top"),
690-
axis.minor.ticks.x.bottom = el_def("element_line", "axis.ticks.x.bottom"),
691-
axis.minor.ticks.y.left = el_def("element_line", "axis.ticks.y.left"),
692-
axis.minor.ticks.y.right = el_def("element_line", "axis.ticks.y.right"),
693-
axis.minor.ticks.theta = el_def("element_line", "axis.ticks.theta"),
694-
axis.minor.ticks.r = el_def("element_line", "axis.ticks.r"),
673+
axis.ticks.x = el_def(element_line, "axis.ticks"),
674+
axis.ticks.x.top = el_def(element_line, "axis.ticks.x"),
675+
axis.ticks.x.bottom = el_def(element_line, "axis.ticks.x"),
676+
axis.ticks.y = el_def(element_line, "axis.ticks"),
677+
axis.ticks.y.left = el_def(element_line, "axis.ticks.y"),
678+
axis.ticks.y.right = el_def(element_line, "axis.ticks.y"),
679+
axis.ticks.theta = el_def(element_line, "axis.ticks.x"),
680+
axis.ticks.r = el_def(element_line, "axis.ticks.y"),
681+
682+
axis.title.x = el_def(element_text, "axis.title"),
683+
axis.title.x.top = el_def(element_text, "axis.title.x"),
684+
axis.title.x.bottom = el_def(element_text, "axis.title.x"),
685+
axis.title.y = el_def(element_text, "axis.title"),
686+
axis.title.y.left = el_def(element_text, "axis.title.y"),
687+
axis.title.y.right = el_def(element_text, "axis.title.y"),
688+
689+
axis.minor.ticks.x.top = el_def(element_line, "axis.ticks.x.top"),
690+
axis.minor.ticks.x.bottom = el_def(element_line, "axis.ticks.x.bottom"),
691+
axis.minor.ticks.y.left = el_def(element_line, "axis.ticks.y.left"),
692+
axis.minor.ticks.y.right = el_def(element_line, "axis.ticks.y.right"),
693+
axis.minor.ticks.theta = el_def(element_line, "axis.ticks.theta"),
694+
axis.minor.ticks.r = el_def(element_line, "axis.ticks.r"),
695695

696696
axis.minor.ticks.length = el_def(c("unit", "rel")),
697697
axis.minor.ticks.length.x = el_def(c("unit", "rel"), "axis.minor.ticks.length"),
@@ -715,25 +715,25 @@ el_def <- function(class = NULL, inherit = NULL, description = NULL) {
715715
c("unit", "rel"), c("axis.minor.ticks.length.y", "axis.ticks.length.r")
716716
),
717717

718-
legend.background = el_def("element_rect", "rect"),
718+
legend.background = el_def(element_rect, "rect"),
719719
legend.margin = el_def(c("margin", "unit", "rel"), "margins"),
720720
legend.spacing = el_def(c("unit", "rel"), "spacing"),
721721
legend.spacing.x = el_def(c("unit", "rel"), "legend.spacing"),
722722
legend.spacing.y = el_def(c("unit", "rel"), "legend.spacing"),
723-
legend.key = el_def("element_rect", "panel.background"),
723+
legend.key = el_def(element_rect, "panel.background"),
724724
legend.key.height = el_def(c("unit", "rel"), "legend.key.size"),
725725
legend.key.width = el_def(c("unit", "rel"), "legend.key.size"),
726726
legend.key.spacing = el_def(c("unit", "rel"), "spacing"),
727727
legend.key.spacing.x = el_def(c("unit", "rel"), "legend.key.spacing"),
728728
legend.key.spacing.y = el_def(c("unit", "rel"), "legend.key.spacing"),
729729
legend.key.justification = el_def(c("character", "numeric", "integer")),
730-
legend.frame = el_def("element_rect", "rect"),
731-
legend.axis.line = el_def("element_line", "line"),
732-
legend.ticks = el_def("element_line", "legend.axis.line"),
730+
legend.frame = el_def(element_rect, "rect"),
731+
legend.axis.line = el_def(element_line, "line"),
732+
legend.ticks = el_def(element_line, "legend.axis.line"),
733733
legend.ticks.length = el_def(c("rel", "unit"), "legend.key.size"),
734-
legend.text = el_def("element_text", "text"),
734+
legend.text = el_def(element_text, "text"),
735735
legend.text.position = el_def("character"),
736-
legend.title = el_def("element_text", "title"),
736+
legend.title = el_def(element_text, "title"),
737737
legend.title.position = el_def("character"),
738738
legend.byrow = el_def("logical"),
739739
legend.position = el_def("character"),
@@ -767,45 +767,45 @@ el_def <- function(class = NULL, inherit = NULL, description = NULL) {
767767
legend.box = el_def("character"),
768768
legend.box.just = el_def("character"),
769769
legend.box.margin = el_def(c("margin", "unit", "rel"), "margins"),
770-
legend.box.background = el_def("element_rect", "rect"),
770+
legend.box.background = el_def(element_rect, "rect"),
771771
legend.box.spacing = el_def(c("unit", "rel"), "spacing"),
772772

773-
panel.background = el_def("element_rect", "rect"),
774-
panel.border = el_def("element_rect", "rect"),
773+
panel.background = el_def(element_rect, "rect"),
774+
panel.border = el_def(element_rect, "rect"),
775775
panel.spacing = el_def(c("unit", "rel"), "spacing"),
776776
panel.spacing.x = el_def(c("unit", "rel"), "panel.spacing"),
777777
panel.spacing.y = el_def(c("unit", "rel"), "panel.spacing"),
778-
panel.grid.major.x = el_def("element_line", "panel.grid.major"),
779-
panel.grid.major.y = el_def("element_line", "panel.grid.major"),
780-
panel.grid.minor.x = el_def("element_line", "panel.grid.minor"),
781-
panel.grid.minor.y = el_def("element_line", "panel.grid.minor"),
778+
panel.grid.major.x = el_def(element_line, "panel.grid.major"),
779+
panel.grid.major.y = el_def(element_line, "panel.grid.major"),
780+
panel.grid.minor.x = el_def(element_line, "panel.grid.minor"),
781+
panel.grid.minor.y = el_def(element_line, "panel.grid.minor"),
782782
panel.ontop = el_def("logical"),
783783
panel.widths = el_def("unit"),
784784
panel.heights = el_def("unit"),
785785

786-
strip.background = el_def("element_rect", "rect"),
787-
strip.background.x = el_def("element_rect", "strip.background"),
788-
strip.background.y = el_def("element_rect", "strip.background"),
786+
strip.background = el_def(element_rect, "rect"),
787+
strip.background.x = el_def(element_rect, "strip.background"),
788+
strip.background.y = el_def(element_rect, "strip.background"),
789789
strip.clip = el_def("character"),
790-
strip.text.x = el_def("element_text", "strip.text"),
791-
strip.text.x.top = el_def("element_text", "strip.text.x"),
792-
strip.text.x.bottom = el_def("element_text", "strip.text.x"),
793-
strip.text.y = el_def("element_text", "strip.text"),
794-
strip.text.y.left = el_def("element_text", "strip.text.y"),
795-
strip.text.y.right = el_def("element_text", "strip.text.y"),
790+
strip.text.x = el_def(element_text, "strip.text"),
791+
strip.text.x.top = el_def(element_text, "strip.text.x"),
792+
strip.text.x.bottom = el_def(element_text, "strip.text.x"),
793+
strip.text.y = el_def(element_text, "strip.text"),
794+
strip.text.y.left = el_def(element_text, "strip.text.y"),
795+
strip.text.y.right = el_def(element_text, "strip.text.y"),
796796
strip.placement = el_def("character"),
797797
strip.placement.x = el_def("character", "strip.placement"),
798798
strip.placement.y = el_def("character", "strip.placement"),
799799
strip.switch.pad.grid = el_def(c("unit", "rel"), "spacing"),
800800
strip.switch.pad.wrap = el_def(c("unit", "rel"), "spacing"),
801801

802-
plot.background = el_def("element_rect", "rect"),
803-
plot.title = el_def("element_text", "title"),
802+
plot.background = el_def(element_rect, "rect"),
803+
plot.title = el_def(element_text, "title"),
804804
plot.title.position = el_def("character"),
805-
plot.subtitle = el_def("element_text", "text"),
806-
plot.caption = el_def("element_text", "text"),
805+
plot.subtitle = el_def(element_text, "text"),
806+
plot.caption = el_def(element_text, "text"),
807807
plot.caption.position = el_def("character"),
808-
plot.tag = el_def("element_text", "text"),
808+
plot.tag = el_def(element_text, "text"),
809809
plot.tag.position = el_def(c("character", "numeric", "integer")), # Need to also accept numbers
810810
plot.tag.location = el_def("character"),
811811
plot.margin = el_def(c("margin", "unit", "rel"), "margins"),
@@ -849,11 +849,18 @@ check_element <- function(el, elname, element_tree, call = caller_env()) {
849849

850850
# NULL values for elements are OK
851851
if (is.null(el)) return()
852+
class <- eldef$class
853+
if (inherits(class, "S7_class") && S7::S7_inherits(el)) {
854+
if (S7::S7_inherits(el, class) ||
855+
(S7::S7_inherits(el, element) && S7::S7_inherits(el, element_blank))) {
856+
return()
857+
}
858+
}
852859

853-
if ("margin" %in% eldef$class) {
860+
if ("margin" %in% class) {
854861
if (!is.unit(el) && length(el) == 4)
855862
cli::cli_abort("The {.var {elname}} theme element must be a {.cls unit} vector of length 4.", call = call)
856-
} else if (!inherits(el, eldef$class) && !inherits(el, "element_blank")) {
863+
} else if (!inherits(el, class) && !inherits(el, "element_blank")) {
857864
cli::cli_abort("The {.var {elname}} theme element must be a {.cls {eldef$class}} object.", call = call)
858865
}
859866
invisible()

man/register_theme_elements.Rd

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)